Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF绑定顺序如何确保一个属性在另一个属性之前绑定_C#_Wpf_Binding - Fatal编程技术网

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

C# WPF绑定顺序如何确保一个属性在另一个属性之前绑定,c#,wpf,binding,C#,Wpf,Binding,我遇到的问题是,在ListView的数据模板中使用此控件时,绑定发生在设置Mode属性之前 如何确保在绑定值之前始终设置模式 您可以做的是延迟绑定,这样您可以(几乎)确定模式值设置到那时。 在.NET4.5中有一个延迟绑定属性。 下面是一篇关于如何在.NET4.0中模拟这种情况的文章 我个人会在viewModel(MVVM)中实现这一点,在MVVM中解决这类问题相当简单。 做两个属性模式什么的。当模式更改时,应触发“Something”属性也已更改(通过INotifyPropertyChang

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


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

您可以做的是延迟绑定,这样您可以(几乎)确定模式值设置到那时。 在.NET4.5中有一个延迟绑定属性。 下面是一篇关于如何在.NET4.0中模拟这种情况的文章

我个人会在viewModel(MVVM)中实现这一点,在MVVM中解决这类问题相当简单。 做两个属性模式什么的。当模式更改时,应触发“Something”属性也已更改(通过INotifyPropertyChanged接口)


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

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");
      }
    }
  }
我假设控件的DataContext是ViewModel的实例,它实现了INotifyPropertyChangedInterface

<Controls:MyControl Mode="Mode1" Value="{Binding Path=Something}" />
如果您的Viemodel类OnPropertyChange方法不是公共的,或者您的控件中没有对ViewModel类的引用。您可以像这样简单地对BindingExpression调用UpdateTarget()(正如Thomas Levesque所建议的那样)-


这取决于你所说的“鼠标总是在前面设置”是什么意思。我猜
模式
也有一个默认值。当
Mode
不为null时,是否希望绑定到happend?似乎值强制可能是适合您的解决方案。@Meleak我说的是控件的Mode属性,而不是鼠标。问题是绑定在设置模式属性之前发生。这会影响控件的行为。我想先设置模式。Mode有一个默认值,所以它永远不会为null,但我想在绑定之前选择控件的模式。当控件的模式被设置时,您是否尝试为属性“某物”引发属性更改事件?@RV1987,这似乎不是一个很好的主意。。。当我们想要延迟从目标更新源代码时,控件不应该知道任何关于“某物”延迟(在.Net4.5中)的信息,但是在这里情况正好相反!!OnPropertyChanged通常不公开;更好的选择是通过在BindingExpressionYeah!上调用UpdateTarget来强制刷新绑定!!我已经更新了我的答案。非常感谢,我差点错过了这一部分。我不能使用property changed event,因为基于Mode属性,绑定到该值的任何内容都可能被丢弃,并且永远无法恢复。我没有理解您。为什么值绑定会被丢弃?PropertyChanged将仅根据绑定更新目标!!我的控件的工作方式是,如果Mode=ModeX,那么就永远不应该绑定到Value属性,这就是为什么它被丢弃的原因。这可能不是实现控件的最理想的方法,但为时已晚,因为我正在广泛使用此控件。
Binding binding = BindingOperations.GetBindingExpression(this, this.Value).ParentBindingBase;
String propertyToRefresh = binding.Path.Path;

(this.DataContext as ViewModel).OnPropertyChange(propertyToRefresh);
BindingExpression binding = BindingOperations.GetBindingExpression(this, this.Value);
binding.UpdateTarget();