6

簡単に言うと、WPFコントロールに2つの依存関係プロパティを作成し、各プロパティ変更通知にコードを入れて、他のプロパティ(つまり、PropA変更セットPropBPropB変更セット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";
        }
    }
4

1 に答える 1

4

これらのコールバックは、プロパティが変更された場合にのみ発生します。コードは、異なる値の無限ループを作成しません。

これを試してみると、SO例外が発生します。

private static readonly Random _random = new Random();
private static void PropBChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs)
{
    ((MainWindow)lDependencyObject).PropA = _random.Next().ToString();
}
private static void PropAChanged(DependencyObject lDependencyObject, DependencyPropertyChangedEventArgs lDependencyPropertyChangedEventArgs)
{
    ((MainWindow)lDependencyObject).PropB = _random.Next().ToString();
}
于 2012-05-14T12:41:14.833 に答える