簡単に言えば、WPFコントロールに2つの依存プロパティを作成し、各プロパティ変更通知にコードを入れて、他のプロパティを変更することができます(PropA
変更セットPropB
およびPropB
変更セットPropA
)。依存関係のプロパティの再入力
私はこれが自分自身の背後に消えてしまうと思っていますが、WPFはそれをうまく処理しているようです。これは実際には私の目的にとっては非常に便利ですが、どこに文書化されているのかわかりません。
何が起こっているのですか? WPF依存関係プロパティは通知システムガードを再入可能状態に変更しますか?
代表のコードは次のとおりです。
XAML:
<Window x:Class="WPFReentrancy1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Text="{Binding PropB, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
コードの後ろに:プロパティはを変更した場合、これらのコールバックは唯一解雇され
public partial class MainWindow : Window
{
public string PropA
{
get { return (string)GetValue(PropAProperty); }
set { SetValue(PropAProperty, value); }
}
public static readonly DependencyProperty PropAProperty =
DependencyProperty.Register("PropA", typeof (string), typeof (MainWindow),new UIPropertyMetadata("0", PropAChanged));
public string PropB
{
get { return (string)GetValue(PropBProperty); }
set { SetValue(PropBProperty, value); }
}
public static readonly DependencyProperty PropBProperty =
DependencyProperty.Register("PropB", typeof (string), typeof (MainWindow), new UIPropertyMetadata("", PropBChanged));
private static void PropBChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs)
{
((MainWindow) lDependencyObject).PropA = (string) lDependencyPropertyChangedEventArgs.NewValue;
}
private static void PropAChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs)
{
((MainWindow) lDependencyObject).PropB =
double.Parse((string) lDependencyPropertyChangedEventArgs.NewValue).ToString("0.000");
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
PropA = "1.123";
}
}
は、具体的な答えを持っていますが、あるとしていない:WPFを考慮すると、あまりにも要素のツリーに沿って再帰的な流れと関連するプロパティを作り、それだけで「節約します"(具体的なイベントの場合)ノードが既に通過して通知を発したので、もう一度会ったらそれらをスキップしてください。 – Tigran