<Controls:MyControl Mode="Mode1" Value="{Binding Path=Something}" />
我遇到的问题是,当我在ListView的数据模板中使用此控件时,在设置Mode属性之前发生绑定。
如何确保在值绑定之前始终设置模式?
答案 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();