WPF绑定顺序如何确保一个属性在另一个属性之前绑定

时间:2011-10-05 20:41:07

标签: c# wpf binding

<Controls:MyControl Mode="Mode1" Value="{Binding Path=Something}" />

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

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

2 个答案:

答案 0 :(得分:1)

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

我个人会在viewModel(MVVM)中实现它,这种问题很容易解决。 制作两个属性Mode and 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");
      }
    }
  }

答案 1 :(得分:1)

您是否尝试在控制模式设置时为您的属性“Something”提升属性更改事件? 您可以像这样控制“Something”这个属性 -

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

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

我假设您的Control的DataContext是您实现INotifyPropertyChangedInterface的ViewModel实例。

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

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