【问题标题】:How to use a programmatic 'get' equivalent in a WPF dependency property?如何在 WPF 依赖属性中使用程序化的“获取”等效项?
【发布时间】:2017-06-07 04:52:42
【问题描述】:

这是写属性的 clr 方式:

public byte Value
{
   get{
     return GetByteData();
   }
   set{
     SetByteData(value);
   }
}

我已经阅读了如何以依赖属性的方式做同样的事情,这就是我自己能做的:

public byte Value
{
    get { return (byte)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
    "Value", typeof(byte), typeof(MyControl),
    new FrameworkPropertyMetadata((byte)0, ValueChanged));

public static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    byte r = (byte)e.NewValue;
    MyControl v = (MyControl)d;
    v.SetByteData(r);
}

通过我查看的示例,我从中制作了上面的 sn-p,我找不到放置 GetByteData() 的地方,它计算当前 UI 状态的输出值用户交互,从而更新“价值”。

直到之前我还是像使用 clr 一样将它放在 getter 中,但我觉得这是错误的方法,但我可能是错的。我应该把它放在哪里?如果没有,我的方法应该是什么?是否有可能为依赖属性提供程序化的 getter?

我可能一直在使用错误的关键字来寻找解决方案。任何帮助我朝着正确的方向前进将不胜感激。提前致谢。

【问题讨论】:

  • 不幸的是,依赖属性没有“获取回调”。它们的 getter 始终且仅返回先前设置的值(直接或通过绑定、样式、默认值等)。为什么你的属性必须是依赖属性?
  • 还要注意,PropertyChangedCallback 中的分配v.Value = r 是多余的。该属性已经具有该值。我已将其从您的示例代码中删除。
  • 哦!完全不同的方法!所以这意味着我必须通过在用户交互时触发事件来更新依赖值?我想每次都会使用SetByteData 来同步用户界面。有点多余,但我想我可以使用状态变量让它跳过重做。 @为什么它需要依赖:我需要一个不同的 UI 元素来做:{Binding Value, ElementName=MyControlName}。我不确定这是否适用于 clr 属性...

标签: c# wpf dependency-properties getter


【解决方案1】:

只要它只是一个 Binding 的源(而不是目标)属性,如

{Binding Value, ElementName=MyControlName}

并且您不想通过 Style Setter 应用值,或为该值设置动画,该属性不需要是依赖属性。

只需像这样实现INotifyPropertyChanged

public partial class MyControl : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public byte Value
    {
       get { return GetByteData(); }
       set
       {
           SetByteData(value);
           PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
       }
    }

    ...
}

【讨论】:

  • 我可能最终也会要求它作为目标。但是我还没有找到以这种方式实现它的地方。它实际上是一个显示一个“字节”的控件,其中包含一系列代表各个位的切换按钮。还有一个用于手动输入数字的部分,在同一个用户控件中。所以,这是一种我打算在很多地方使用的库控件。拥有依赖属性可能会有所帮助。每次用户与我的控件交互时,我都会尝试更新依赖值,看看效果如何。
  • 另外,感谢PropertyChanged?.Invoke 语法。我想知道如何做到这一点,因为我已经习惯了 C++ 的方式来做PropertyChanged(this, new ...);
  • 感谢您的指导。我设法让它工作。只需写下 wpf getter 不能那样工作,或者我必须手动更新它。我会将其标记为答案,因为这与问题最相关。 :)
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多