【问题标题】:WPF Binding order how to ensure one property binds before anotherWPF绑定顺序如何确保一个属性在另一个之前绑定
【发布时间】:2011-12-01 19:40:23
【问题描述】:
<Controls:MyControl Mode="Mode1" Value="{Binding Path=Something}" />

我遇到的问题是,当我在 ListView 的数据模板中使用此控件时,绑定发生在设置 Mode 属性之前。

如何确保在值绑定之前始终设置模式?

【问题讨论】:

  • 这取决于您所说的“鼠标始终设置在前面”的意思。我猜Mode 也有一个默认值。您是否希望在Mode 不为空时发生绑定?
  • 看起来价值强制可能是适合您的解决方案。
  • @Meleak 我说的是我的控件的 Mode 属性而不是鼠标。问题是在设置 Mode 属性之前发生绑定。这会影响控件的行为方式。我想先设置模式。模式有一个默认值,因此它永远不会为空,但我想在绑定发生之前选择控件的模式。
  • 您是否尝试在设置控件模式时为您的属性“Something”引发属性更改事件?
  • @RV1987,这似乎不是一个好主意……控件不应该知道任何关于“某事”的信息

标签: c# wpf binding


【解决方案1】:

您是否尝试在设置控件模式时为您的属性“Something”引发属性更改事件? 你可以像这样在你的控件中获取属性“Something”-

Binding binding = BindingOperations.GetBindingExpression(this, this.Value).ParentBindingBase;
String propertyToRefresh = binding.Path.Path;

(this.DataContext as ViewModel).OnPropertyChange(propertyToRefresh);

我假设你的控件的 DataContext 是你的 ViewModel 的实例,它实现了 INotifyPropertyChangedInterface。

如果您的 Viemodel 类 OnPropertyChange 方法不是公共的,或者您的控件中没有对 ViewModel 类的引用。您可以像这样简单地在您的 BindingExpression 上调用 UpdateTarget()(如 Thomas Levesque 所建议的那样)-

BindingExpression binding = BindingOperations.GetBindingExpression(this, this.Value);
binding.UpdateTarget();

【讨论】:

  • OnPropertyChanged 通常不公开;更好的选择是通过在 BindingExpression 上调用 UpdateTarget 来强制刷新绑定
  • 是的!我已经更新了我的答案。非常感谢,我差点错过了这部分。
  • 我无法使用属性更改事件,因为基于 Mode 属性,绑定到 Value 的任何内容都可能被丢弃并且永远无法恢复。
  • 我没听懂你。为什么 Binding for value 会被丢弃? PropertyChanged 只会根据绑定更新目标!!
  • 我的控件的工作方式是,如果 Mode=ModeX 那么你永远不应该绑定到 Value 属性,这就是它被丢弃的原因。这可能不是实现控件的最理想方式,但为时已晚,因为我广泛使用此控件。
【解决方案2】:

您可以做的是延迟绑定,因此您可以(几乎)确定在此之前设置了模式值。 .net 4.5 中有一个延迟绑定属性。 这是一篇关于如何在 .net 4.0 中模拟的文章 Delay property on Binding from .Net 4.5 in .Net 4.0

我个人会在 viewModel (MVVM) 中实现这一点,这种问题很容易解决。 制作两个属性 Mode 和 Something。当模式更改时,它应该触发“Something”属性也被更改(通过 INotifyPropertyChanged 接口)。

class MyViewModel : INotifyPropertyChanged
  {
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
      if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private string _mode;

    public string Mode
    {
      get { return _mode; }
      set
      {
        _mode = value;
        OnPropertyChanged("Mode");

        // OnPropertyChanged("Something");
        // or build up via a method:
        // Something = DetermineFromMode(Mode);
      }
    }

    private string _something;

    public string Something
    {
      get { return _something;  }
      set
      {
        _something = value;
        OnPropertyChanged("Something");
      }
    }
  }

【讨论】:

  • Delay(in .Net4.5) 当我们想要延迟更新来自目标的源时使用,但这里的情况正好相反!!
猜你喜欢
  • 2021-08-22
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多