này bắt đầu với hành vi kỳ lạ mà tôi nghĩ đã được gắn liền với thực hiện của tôi ToString()
, và tôi đã hỏi câu hỏi này: Why won't WPF databindings show text when ToString() has a collaborating object?Hành vi ràng buộc WPF khác nhau khi thuộc tính bị ràng buộc được khai báo là giao diện so với loại lớp học như thế nào?
Hóa ra không có gì để làm với cộng tác viên và là tái sản xuất.
Khi tôi liên kết Label.Content
với thuộc tính của DataContext
được khai báo là loại giao diện, ToString()
được gọi trên đối tượng thời gian chạy và nhãn hiển thị kết quả.
Khi tôi liên kết TextBlock.Text
với cùng một thuộc tính, ToString()
không bao giờ được gọi và không có gì được hiển thị. Nhưng, nếu tôi thay đổi thuộc tính được khai báo thành triển khai cụ thể của giao diện, nó hoạt động như mong đợi.
Đây có phải là do thiết kế không? Nếu vậy, bất kỳ ý tưởng tại sao?
Để tái sản xuất:
- Tạo một ứng dụng WPF mới (NET 3.5 SP1)
- Thêm các lớp sau:
public interface IFoo { string foo_part1 { get; set; } string foo_part2 { get; set; } } public class Foo : IFoo { public string foo_part1 { get; set; } public string foo_part2 { get; set; } public override string ToString() { return foo_part1 + " - " + foo_part2; } }
public class Bar
{
public IFoo foo
{
get { return new Foo {foo_part1 = "first", foo_part2 = "second"}; }
}
}
Đặt XAML của Window1 tới:
<Window x:Class="WpfApplication1.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"> <StackPanel> <Label Content="{Binding foo, Mode=Default}"/> <TextBlock Text="{Binding foo, Mode=Default}"/> </StackPanel> </Window>
trong Window1.xaml.cs:
public partial class Window1 : Window { public Window1() { InitializeComponent(); DataContext = new Bar(); } }
Khi bạn chạy ứng dụng này, bạn sẽ thấy văn bản chỉ một lần (ở trên cùng, trong nhãn). Nếu bạn thay đổi loại tài sản foo
trên Bar
lớp thành Foo
(thay vì IFoo
) và chạy lại ứng dụng, bạn sẽ thấy văn bản trong cả hai điều khiển.
Henrik, [ai đó đã hỏi một câu hỏi rất giống] (http://stackoverflow.com/questions/16309863/binding-to-interface-typed-properties), và khi tôi liên kết họ với người này, họ nói câu trả lời của bạn đã giải quyết được vấn đề của họ. Câu hỏi đó là của bạn để trả lời nếu bạn thích; Tôi không muốn nhận tín dụng khi tất cả những gì tôi làm là tìm một câu hỏi tương tự :) – shambulator