ViewModel的对象绑定 - 如何在其属性更改之一时通知UI

时间:2013-03-23 02:03:04

标签: wpf data-binding mvvm triggers prism

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

 <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");
        }
    }
}

3 个答案:

答案 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的内容