2010-02-23 32 views
21

Tôi đang cố gắng lấy nội dung của nhãn để liên kết với thuộc tính chuỗi của cá thể lớp mà không thành công nhiều.WPF: Gắn nhãn cho thuộc tính lớp

XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W1}" VerticalAlignment="Top" /> 

    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W2}" VerticalAlignment="Top" /> 

    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" 
      Name="button1" VerticalAlignment="Bottom" Width="89" 
      Click="button1_Click"> 
     Set Properties 
    </Button> 

</Grid> 
</Window> 

C#:

namespace WPFBindingTest 
{ 
    public partial class Window1 : Window 
    { 
     public Foo MyFoo; 

     public Window1() 
     { 
      InitializeComponent();    

      MyFoo = new Foo();   
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     {  
      MyFoo.W1 = "Hello"; 
      MyFoo.W2 = "Dave"; 
     } 
    } 

    public class Foo 
    { 
     public string W1 { get; set; } 
     public string W2 { get; set; } 
    } 
} 

tức là khi tôi nhấp vào nút, tôi thiết lập các thuộc tính của MyFoo để "Hello" và "Dave", và muốn điều đó phản ánh trong nhãn trên giao diện người dùng. Tôi đã đặt Nội dung làm ràng buộc nhưng có điều gì đó không đúng. Tôi làm gì sai ở đây?

Trả lời

18

Bạn có thể làm cho MyFoo một tài sản phụ thuộc của bạn và thiết lập DataContext-Window1 dụ của bạn:

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ...> 

Xem article này để biết thêm chi tiết.

Làm MyFoo thuộc tính phụ thuộc không bắt buộc. nó có thể chỉ hoạt động với một thuộc tính nếu bạn đặt giá trị thuộc tính trước khi gán DataContext. (Nhưng không bao giờ có trường.) Tuy nhiên nếu bạn muốn nhãn nhận các giá trị thay đổi của W1W2 (hoặc bạn không biết/quan tâm nếu các giá trị được đặt trước hoặc sau khi gán DataContect), bạn cần Foo hoặc là DependencyObject hoặc triển khai giao diện INotifyPropertyChanged.

+1

Thanks, điều này chỉ cho tôi đi đúng hướng. Thực hiện Foo triển khai INotifyPropertyChanged, sau đó thiết lập DataContext của Window1 thành của BindingList , chứa MyFoo. Nội dung nhãn hiện là: {Đường dẫn ràng buộc = W1, UpdateSourceTrigger = PropertyChanged} Và nó hoạt động tốt! – Gareth

+1

@Vlad Sự khác biệt giữa việc sử dụng 'DependencyProperty' và triển khai' INotifyPropertyChanged' hoặc điều này sẽ là một câu hỏi của chính nó? – ywm

+0

@ymw: đây là một câu hỏi khác, trên thực tế khá lớn. Tóm lại: cả hai sẽ làm việc cho chỉ ràng buộc, nhưng 'INotifyPropertyChanged' là nhẹ hơn,' DependencyProperty' tuy nhiên không mất bộ nhớ nếu không được sử dụng và có thể được sử dụng cho hoạt ảnh, kiểu dáng, mẫu, được kế thừa (từ thùng chứa mẹ đến và nhiều hơn nữa. Xem ví dụ [câu trả lời này] (http://stackoverflow.com/a/3674530/276994). – Vlad

6

Hoặc cho Window của bạn một cái tên: như NameOfWindow và sử dụng một ElementName ràng buộc:

Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" 

Toàn bộ mẫu XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" Name="NameOfWindow">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" VerticalAlignment="Top" /> 
    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W2}" VerticalAlignment="Top" /> 
    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button> 
</Grid> 
+1

tính năng này không hoạt động. – AnjumSKhan

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