Làm cách nào tôi có thể truy cập biến công khai trong tệp Sample.xaml.cs như asp.net <% = VariableName%>?Truy cập biến codebehind trong XAML
Trả lời
Có một số cách để thực hiện việc này.
Thêm biến của bạn như một nguồn lực từ codebehind:
myWindow.Resources.Add("myResourceKey", myVariable);
Sau đó, bạn có thể truy cập nó từ XAML:
<TextBlock Text="{StaticResource myResourceKey}"/>
Nếu bạn cần phải thêm nó sau khi XAML được phân tích cú pháp, bạn có thể sử dụng một số
DynamicResource
ở trên thay vìStaticResource
.Biến biến thành thuộc tính của thứ gì đó trong XAML của bạn. Thường làm việc này thông qua
DataContext
:myWindow.DataContext = myVariable;
hoặc
myWindow.MyProperty = myVariable;
Sau đó, bất cứ điều gì trong XAML của bạn có thể truy cập nó thông qua một
Binding
:<TextBlock Text="{Binding Path=PropertyOfMyVariable}"/>
hoặc
<TextBlock Text="{Binding ElementName=myWindow, Path=MyProperty}"/>
Đối với Windows nhanh và bẩn trong WPF, tôi thích ràng buộc DataContext của Window vào cửa sổ chính nó; điều này tất cả có thể được thực hiện trong XAML.
Window1.XAML
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource self}}"
Title="Window1" Height="300" Width="300">
<StackPanel>
<TextBlock Text="{Binding Path=MyProperty1}" />
<TextBlock Text="{Binding Path=MyProperty2}" />
<Button Content="Set Property Values" Click="Button_Click" />
</StackPanel>
</Window>
Window1.xaml.cs
public partial class Window1 : Window
{
public static readonly DependencyProperty MyProperty2Property =
DependencyProperty.Register("MyProperty2", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));
public static readonly DependencyProperty MyProperty1Property =
DependencyProperty.Register("MyProperty1", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));
public Window1()
{
InitializeComponent();
}
public string MyProperty1
{
get { return (string)GetValue(MyProperty1Property); }
set { SetValue(MyProperty1Property, value); }
}
public string MyProperty2
{
get { return (string)GetValue(MyProperty2Property); }
set { SetValue(MyProperty2Property, value); }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// Set MyProperty1 and 2
this.MyProperty1 = "Hello";
this.MyProperty2 = "World";
}
}
Trong ví dụ trên, lưu ý các ràng buộc được sử dụng trong DataContext
tài sản trên Window, điều này nói " Đặt bối cảnh dữ liệu của bạn cho chính bạn ". Hai khối văn bản được gắn với MyProperty1
và MyProperty2
, trình xử lý sự kiện cho nút sẽ đặt các giá trị này, sẽ tự động lan truyền đến thuộc tính Text
của hai TextBlocks vì thuộc tính là Thuộc tính phụ thuộc.
Đối với ràng buộc, nếu DataContext
không được sử dụng, bạn chỉ có thể thêm video này vào các nhà xây dựng của mã đằng sau:
this.DataContext = this;
Sử dụng này, mọi thuộc tính trong mã trở nên dễ tiếp cận để ràng buộc:
<TextBlock Text="{Binding PropertyName}"/>
một cách khác là chỉ cần đặt tên cho phần tử gốc của XAML:
x:Name="root"
Kể từ khi XAML được biên soạn như một lớp học phần của mã-đằng sau, chúng ta có thể truy cập vào tất cả các tài sản theo tên:
<TextBlock Text="{Binding ElementName="root" Path=PropertyName}"/>
Lưu ý: Truy cập chỉ dành cho những tài sản; không đến các trường. và get;
hoặc {Binding Mode = OneWay}
là cần thiết. Nếu sử dụng liên kết OneWay, dữ liệu cơ bản sẽ triển khai INotifyPropertyChanged.
Cảm ơn! Câu trả lời này đã giúp tôi. Tôi không thể sử dụng phương thức DataContext vì tôi đang tạo điều khiển người dùng và nếu tôi đặt ngữ cảnh dữ liệu trong điều khiển, thì điều khiển của tôi sẽ không thể lấy được dữ liệu của cha mẹ khi tôi sử dụng nó trong các ứng dụng. Ràng buộc trực tiếp vào thư mục gốc đã cho tôi kết quả tương tự mà tôi đang tìm kiếm và để lại bối cảnh dữ liệu của kiểm soát của tôi bị ảnh hưởng. –
"{Binding PropertyName}" chỉ hoạt động trên tài sản công cộng. – Duc
Cảm ơn lời khuyên "root". Nó hoạt động mặc dù tài sản của code-behind không được liệt kê trong thiết kế ràng buộc trực quan mà là chút bối rối. –
Điều đáng lưu ý là chỉ có thể đặt 'Ràng buộc' trên DependencyProperty của DependencyObject. Nếu bạn muốn thiết lập một DependencyProperty không (ví dụ một thuộc tính bình thường) trên một đối tượng trong XAML, thì bạn sẽ phải sử dụng phương thức đầu tiên của Robert trong việc sử dụng các tài nguyên trong đoạn mã phía sau.
- 1. Cách truy cập cá thể lớp DataContext được tạo trong XAML trong codebehind?
- 2. Cách truy cập động tên phần tử trong XAML?
- 3. Làm cách nào để truy cập IFRAME từ tệp codebehind trong ASP.NET?
- 4. Tạo VisualState tùy chỉnh trong xaml và đặt thủ công nó trong CodeBehind
- 5. Truy cập đối tượng khởi tạo XAML từ C#
- 6. ASP.NET: Truy cập phiên biến trong global.asax
- 7. Javascript biến truy cập trong HTML
- 8. Cách truy cập biến javascript trong @ URL.Action()
- 9. truy cập biến đồng thời trong c
- 10. Truy cập biến trong tập lệnh bash
- 11. Truy cập biến EJS trong Javascript Javascript
- 12. Truy cập các biến tĩnh
- 13. truy cập vào biến trong lớp bên trong trong java
- 14. Tại sao truy cập biến cục bộ nhanh hơn truy cập thành viên lớp trong Python?
- 15. truy cập bên trong biến hàm trong Javascript
- 16. Biến phiên truy cập từ HTTPModule
- 17. Truy cập biến tĩnh bằng $ var :: $ reference
- 18. Truy cập các biến cấu hình Devise
- 19. Python: biến truy cập lớp qua dụ
- 20. truy cập biến từ một lớp khác
- 21. Biến số lượt truy cập node.js
- 22. Truy cập biến theo tên chuỗi
- 23. WPF - giúp chuyển đổi biểu thức ràng buộc XAML thành codebehind
- 24. Tạo truy cập với nhiều biến
- 25. D Inline Assembler: Truy cập Biến tĩnh
- 26. Biến số lượt truy cập cho lớp
- 27. Instance biến 'biến' truy cập do lỗi phương pháp lớp
- 28. Truy cập biến ngoài câu lệnh 'if'
- 29. sở hữu truy cập LINQ bởi biến
- 30. Truy cập vào biến JavaScript từ PHP
[Câu hỏi này cũng có thể hữu ích] (http://stackoverflow.com/questions/1481130/wpf-binding-to-local-variable) vì nó gần đây hơn một chút ... – Brendan