我有这样定义的数据触发器:
<DataTrigger Binding="{Binding Path=DataContext.MyObject.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
MyObject在View Model中。现在,当MyObject的MyProperty发生更改时,即使MyProperty通知OnPropertyChange,它也不会通知UI。当我们使用Microsoft Prism作为框架时,对象MyObject已向Container注册。
我应该如何让它发挥作用?
修改: MyObject以这种方式定义:
public class MyObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private bool _myProperty;
public bool MyProperty
{
get { return _myProperty; }
set
{
if (value == _myProperty)
return;
_myProperty = value;
OnPropertyChanged("MyProperty");
}
}
}
答案 0 :(得分:0)
我没有看到您发布的代码有任何“错误” - 您绝对确定要更改属性值,并执行任何必需的调用回适当的Dispatcher
?
你可以试试这个结构吗? (疯狂猜测,不确定它是否适合您的背景)
[编辑:我要从内存开始,所以语法需要调整]
<Trigger Property="{Binding Path=DataContext.MyObject.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
<Setter Property="IsEnabled" Value="False" />
</Trigger>
答案 1 :(得分:0)
您确定RelativeSource
无法明确FindAncestor
吗?尝试改变
RelativeSource={RelativeSource AncestorType=UserControl}}"
为:
RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
答案 2 :(得分:0)
如果DataContext
设置为MyObject
的实例 - 那么您只需要DataContext.MyProperty
- 除非您的datacontext确实有一个名为MyObject
的属性,这也是一个MyObject
的实例
DataContext.MyProperty
(DataContext已经是MyObject的实例)
VS
DataContext.MyObject.MyProperty
(你的datacontext对象(viewmodel)是否真的有一个名为MyObject的MyObject属性?)
示例:
<DataTrigger Binding="{Binding Path=DataContext.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
如果我错了,您可以发布ViewModel
的代码 - 即设置为DataContext的内容