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