【问题标题】:Dependency property re-entrancy (or: why does this work?)依赖属性重入(或:为什么会这样?)
【发布时间】:2012-05-14 12:25:33
【问题描述】:

简单地说,我可以在 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";
        }
    }

【问题讨论】:

  • 没有具体的答案,但假设:考虑到 WPF 也沿着元素的树和相关属性进行递归流动,它只是“保存”(对于具体事件)它已经通过的节点并触发通知,因此如果再次遇到它们,请跳过它们。

标签: c# wpf dependency-properties


【解决方案1】:

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

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

【讨论】:

  • 我猜线索就在名字里!我假设无论如何都会触发通知,但我刚刚做了一个快速测试,看来这正是正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2011-04-15
  • 2010-10-11
  • 2012-01-07
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多