依赖属性重入(或者:为什么这样做?

本文关键字:为什么 这样做 或者 属性 依赖 | 更新日期: 2023-09-27 18:34:01

简而言之,我可以在 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";
        }
    }

依赖属性重入(或者:为什么这样做?

这些回调仅在属性更改时触发,您的代码不会创建不同值的无限循环。

试试这个,你会得到一个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();
}