【问题标题】:Binding to properties of object within View Model WPF绑定到视图模型 WPF 中对象的属性
【发布时间】:2012-07-10 18:49:28
【问题描述】:

在我的班级“ScheduleViewModel”中,我有以下属性:

private ReminderFilter filter;
public ReminderFilter Filter
{
 get { return filter; }
 set
 {
     filter = value;
     NotifyPropertyChanged("Filter");
 }
}

我想做的是绑定到这个对象的属性,而不需要在视图模型中公开它们。我尝试了以下 XAML,但没有成功:

<CheckBox IsChecked="{Binding Filter.Complete, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Content="Show Completed"></CheckBox>

有什么建议吗?

【问题讨论】:

  • 问个简单的问题,ReminderFilter 是否也实现了INotifyPropertyChanged?因为(afaik)Filter.Complete 绑定应该可以工作。
  • 您检查数据绑定错误了吗?是否初始化了属性?
  • 我刚刚更改了 ReminderFilter 以实现 INotifyPropertyChanged 但更改 CheckBoxes IsChecked 之后甚至没有调用 Complete 集。我可能做错了什么?
  • 显示将视图 Datacontext 绑定到您的 VieModel 或此复选框包含的所有内容的 XAML。它闻到绑定找不到正确的数据上下文

标签: c# wpf xaml binding


【解决方案1】:

我认为您需要双向绑定。 Oneway 只会更新视图。如果您选中该复选框,则该值不会向下传播回对象。

【讨论】:

  • 我将 Mode 更改为 Two Way ,它仍然没有调用 Complete 属性的集合。
  • 检查输出控制台中的数据绑定错误。此复选框可能没有此视图模型的数据上下文。
  • 我检查了复选框的数据上下文,它设置正确。
  • 当应用程序运行时,查看输出窗口 Ctrl+W,O 。数据绑定中的任何错误都将在此处可见。
  • 我在输出窗口中找不到任何数据绑定错误。
【解决方案2】:

如果您想避免在视图模型中公开该属性,则必须在 ReminderFilter 模型中实现 INotifyPropertyChanged。

Similar SO Discussion on Get Notified when model properties change

我知道您说过您不想在视图模型中公开该属性,但如果您反对在模型中实现 INotifyPropertyChanged:

    private ReminderFilter filter;
    public bool FilterComplete
    {
        get
        {
            return filter.Complete;
        }
        set
        {
            if (value == filter.Complete)
                return;
            filter.Complete = value;
            NotifyPropertyChanged("FilterComplete");
        }
    } 

xaml:

<CheckBox IsChecked="{Binding FilterComplete}" Content="Show Completed"></CheckBox>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多