2010-12-28 40 views
6

Tôi đang chơi với WPF Binding và các biến. Rõ ràng người ta chỉ có thể gắn DependencyProperties. Tôi đã đưa ra những điều sau đây, hoạt động hoàn toàn tốt đẹp: Các code-behind file:WPF Ràng buộc với biến/DependencyProperty

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public string Test 
    { 
     get { return (string)this.GetValue(TestProperty); } 
     set { this.SetValue(TestProperty, value); } 
     //set { this.SetValue(TestProperty, "BBB"); } 
    } 
    public static readonly DependencyProperty TestProperty = DependencyProperty.Register(
     "Test", typeof(string), typeof(MainWindow), new PropertyMetadata("CCC")); 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(Test); 
     Test = "AAA"; 
     MessageBox.Show(Test); 
    } 
} 

XAML:

<Window x:Class="WpfApplication3.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
    Title="MainWindow" Height="350" Width="525" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Grid> 
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,86,0,0" Name="textBox1" VerticalAlignment="Top" Width="152" 
      Text="{Binding Test, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}"/> 
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="320,85,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,138,0,0" Name="textBox2" Text="{Binding Test, Mode=TwoWay}" VerticalAlignment="Top" Width="152" /> 
</Grid> 

Hai textbox cập nhật một một khác. Và nút đặt chúng thành "AAA".

Nhưng bây giờ tôi đã thay thế hàm Setter bằng hàm được nhận xét (mô phỏng một số thao tác của giá trị đã cho). Tôi hy vọng rằng bất cứ khi nào giá trị tài sản được thay đổi, nó sẽ được đặt lại thành "BBB". Nó làm như vậy khi bạn nhấn nút, đó là khi bạn đặt thuộc tính trong mã. Nhưng nó cho một số lý do không ảnh hưởng đến Bindings WPF, đó là bạn có thể thay đổi nội dung TextBox và do đó tài sản, nhưng dường như Setter không bao giờ được gọi. Tôi tự hỏi tại sao đó là như vậy, và làm thế nào người ta sẽ đi về để đạt được hành vi mong đợi.

+0

thể trùng lặp của [WPF: tài sản XAML khai báo không được thiết lập thông qua Setters?] (http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

Trả lời

13

Trình bao bọc thuộc tính CLR cho Thuộc tính phụ thuộc không bao giờ được đảm bảo để được gọi và do đó, bạn không bao giờ nên đặt thêm bất kỳ logic nào tại đó. Bất cứ khi nào bạn cần thêm logic khi DP bị thay đổi, bạn nên sử dụng thuộc tính đã thay đổi gọi lại.

Trong trường hợp của bạn ..

public string Test 
{ 
    get { return (string)this.GetValue(TestProperty); } 
    set { this.SetValue(TestProperty, value); } 
} 

public static readonly DependencyProperty TestProperty = 
    DependencyProperty.Register("Test", 
    typeof(string), 
    typeof(MainWindow), 
    new PropertyMetadata("CCC", TestPropertyChanged)); 

private static void TestPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
{ 
    MainWindow mainWindow = source as MainWindow; 
    string newValue = e.NewValue as string; 
    // Do additional logic 
} 
2

Thay đổi của bạn sẽ không ảnh hưởng đến các ràng buộc vì XAML sẽ gọi SetValue trực tiếp, thay vì gọi setter.That tài sản của bạn là như thế nào phụ thuộc hệ thống sở hữu works.When một sự phụ thuộc tài sản được đăng ký một giá trị mặc định có thể được xác định. Giá trị này được trả về từ GetValue và là giá trị mặc định cho thuộc tính của bạn.

Kiểm tra liên kết dưới đây và đọc qua bài Robert Rossney của để có được một cái nhìn tổng quan hội chợ

WPF: What distinguishes a Dependency Property from a regular CLR Property?

cũng không bỏ lỡ

http://msdn.microsoft.com/en-us/library/ms753358.aspx

http://msdn.microsoft.com/en-us/library/ms752914.aspx

Cũng lưu ý rằng không giống như trong tính CLR bình thường bất kỳ logic tùy chỉnh bạn viết trong setter sẽ không được thực hiện trong phụ thuộc Properties, thay vào đó bạn phải sử dụng cơ chế PropertyChangedCallback

http://blogs.msdn.com/b/delay/archive/2010/03/23/do-one-thing-and-do-it-well-tip-the-clr-wrapper-for-a-dependencyproperty-should-do-its-job-and-nothing-more.aspx

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