0

我有一个这样定义的数据触发器:

 <DataTrigger Binding="{Binding Path=DataContext.MyObject.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
    <Setter Property="IsEnabled" Value="False" />
 </DataTrigger>

MyObject 在视图模型中。现在,当 MyObject 的 MyProperty 更改时,它不会通知 UI,即使 MyProperty 确实通知 OnPropertyChange。当我们使用 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");
        }
    }
}
4

3 回答 3

0

如果DataContext设置为的实例MyObject- 那么你只是想要DataContext.MyProperty- 除非你的数据上下文确实有一个名为的属性MyObject,它也是一个实例MyObject

DataContext.MyProperty(DataContext 已经是 MyObject 的实例)

对比

DataContext.MyObject.MyProperty(您的数据上下文对象(视图模型)是否真的有一个名为 MyObject 的 MyObject 类型的属性?)

例子 :

<DataTrigger Binding="{Binding Path=DataContext.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
    <Setter Property="IsEnabled" Value="False" />
 </DataTrigger>

如果我错了,您能否发布代码ViewModel- 即设置为 DataContext的代码

于 2013-03-26T14:56:49.047 回答
0

你确定RelativeSource没有明确的作品FindAncestor吗?尝试改变

RelativeSource={RelativeSource AncestorType=UserControl}}"

至:

RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"

于 2013-03-23T06:04:12.263 回答
0

我没有看到您发布的代码有任何“错误” - 您绝对确定您正在更改属性值,并执行任何所需的调用回到正确的Dispatcher

你可以试试这个结构吗?(疯狂猜测,不确定它是否适合您的上下文)

[编辑:我从这里记忆,所以语法需要调整]

<Trigger Property="{Binding Path=DataContext.MyObject.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
    <Setter Property="IsEnabled" Value="False" />
</Trigger>
于 2013-03-23T04:03:29.927 回答