Fody PropertyChanged不触发另一个属性。

4
我正在进行一个WPF项目。为了避免大量样板代码,我使用Fody PropertyChanged。这是我的问题片段:
[ImplementPropertyChanged]
public class MyViewModel : MyViewModelBase
{
    public bool HasCardSet
    {
        get
        {
            return Person != null && Person.Card != null;
        }
    }

    public void SavePerson()
    {
        Person.Card = new Card();
    }
}

[ImplementPropertyChanged]
public class MyViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public Person Person { get; set; }
}

[ImplementPropertyChanged]
public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public Card Card { get; set; }
}

[ImplementPropertyChanged]
public class Card : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string Name { get; set; }
    public ObservableCollection<SomeOtherClass> Items { get; set; }
}

当我调用 SavePerson()(在MyViewModel中)时,它不会触发 HasCardSet属性。 我添加了PropertyChangedNotificationInterceptor并查看目标“People”上的属性“Card”是否更改。但是,我的HasCardSet中断点没有触发。


如果HasCardSet不再是Person的一部分,那么现在该如何绑定? - netaholic
我的Person有另一个属性Info(类),它有一个字符串属性Name。(Person.Info.Name)如果我在代码中更改它,我的XAML绑定将得到更新。那么为什么这个可以工作,而这个不行呢? - RvdK
@OP:这很大程度上取决于您如何更新属性(您是设置Person的Info属性还是仅设置此属性的名称?)以及绑定本身。更多的代码可能会有所帮助... - xum59
1个回答

6

您需要在Person类中声明HasCardSet属性。

然后,根据文档的建议,添加以下方法:

public void OnCardChanged()
{
    HasCardSet = Card != null;
}

这将触发预期的PropertyChanged事件。
请注意,您的Binding应该将您的Person对象作为DataContext,而不是直接使用您的视图模型。

将HasCardSet移动到Person中,并更新XAML以侦听Person.HasCardSet。这很有效!没有使用OnCardChanged。 - RvdK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接