2010-12-28 17 views
6

私はWPFバインディングと変数を使用して遊んでいます。明らかにDependencyPropertiesのみをバインドできます。私は完全に正常に動作され、次が出ている: コードビハインドファイル:変数/ DependencyPropertyへのWPFバインド

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> 

2つのTextBoxを1他を更新します。ボタンで「AAA」に設定されます。

しかし、私は、Setter関数をコメントアウトされたもの(指定された値の操作をシミュレートする)で置き換えました。私はプロパティの値が変更されるたびに "BBB"にリセットされることを期待しています。これは、コード内でプロパティを設定するときにボタンを押すと実行されます。しかし何らかの理由でWPFバインディングに影響しません。つまり、TextBoxの内容とプロパティを変更できますが、Setterは決して呼び出されません。 私はそれがなぜそうであるのか、誰がどのようにして期待される行動を起こすのだろうと思います。

+0

[WPFの可能な複製をPropertyChangedCallbackメカニズムを使用する必要があり、通常のCLRプロパティとは異なりますが、セッターで書く任意のカスタムロジックは依存関係プロパティで実行されないことに注意してください宣言はSetters経由で設定されていませんか?](http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

答えて

13

依存プロパティのCLRプロパティラッパーが呼び出されることは決して保証されません。そのため、追加のロジックを決して配置しないでください。 DPが変更されたときに追加のロジックが必要な場合は、プロパティ変更コールバックを使用する必要があります。あなたのケースでは

XAMLではなく、あなたの財産のsetter.Thatを呼び出す、直接のSetValueを呼び出しますので...

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

あなたの変更は、結合には影響しませんどのように依存関係プロパティシステムworks.When依存関係ですプロパティが登録されている場合、デフォルト値を指定できます。この値はGetValueから返され、プロパティのデフォルト値です。

下のリンクをチェックして、公正な概観

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

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

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

をお見逃しなく取得するロバートRossneyのポストに直接読み取り XAMLプロパティ:

はまた、代わりにあなたが

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

関連する問題