2009-03-20 24 views
43

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

+0

[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

Trả lời

60

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}"/> 
    
9

Đố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 MyProperty1MyProperty2, 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.

23

Đố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.

+1

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. –

+1

"{Binding PropertyName}" chỉ hoạt động trên tài sản công cộng. – Duc

+0

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. –

3

Đ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.

Các vấn đề liên quan