【问题标题】:How to set a value in a ViewModel from binding?如何通过绑定在 ViewModel 中设置值?
【发布时间】:2011-01-22 12:49:46
【问题描述】:

有点奇怪的问题 - 如果我想错了,请告诉我。我正在使用一个基础设施坞站管理器,它也管理选项卡。所以我可以创建一个TabGroupPane,然后添加多个ContentPanes,每个ContentPanes都有自己的tab。

在每个内容窗格中,我设置了我的视图模型:

<ContentPane>
  <viewmodels:MyViewModelForTab1 />
</ContentPane>

所以问题来了——在使用中介者模式进行通信时,我的视图模型不知道它们是否在可见选项卡上,因此即使隐藏它们也始终在工作。 TabGroupPane 确实有一个SelectedTab 属性,每个ContentPane 都有一个IsActive 属性。

所以问题是如何在我的 ViewModel 中设置这些信息?让我的虚拟机成为依赖对象似乎是个坏主意,因为我已经实现了INotifyPropertyChanged。在我的 VM 中使用 CLR 属性也不起作用,因为您无法绑定到它。

如何让我的虚拟机知道它是否是活动选项卡的数据上下文?

谢谢!

【问题讨论】:

    标签: wpf data-binding mvvm viewmodel dependency-properties


    【解决方案1】:

    我会在我的 ViewModel 上放置一个 IsSelected 属性并将其绑定到 TabItem 的 IsSelected 依赖属性。

    这应该允许您在更新时挂钩并执行您需要的任何操作。这里不需要中介者模式,因为您是从 View 到 ViewModel 进行通信的。

    确保您的 ViewModel 绑定到视图的 DataContext 属性(具体来说,Tab 的 DataContext 是 ViewModel)。你现在拥有它的方式,你的 ViewModel 是元素的内容,而不是绑定到 DataContext,因为它应该是:

    <Tab.Resources>
        <viewmodels:MyViewModelForTab1 x:Key="Tab1ViewModel" />
    </Tab.Resources>
    
    <ContentPane DataContext="{StaticResource Tab1ViewModel}" />
    

    或者类似的...

    【讨论】:

    • 我先试过了——但你不能绑定到非依赖属性(正如我提到的)。这是您得到的错误:错误 1 ​​无法在“MyViewModel”类型的“IsActiveTab”属性上设置“绑定”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。也许我做错了?
    • 那么您的绑定可能不正确。我已经实现了这个并且它有效。您需要确保将视图模型设置为依赖对象的 DataContext。这是 MVVM 的一个相当严格的要求。
    • 嗯,我正在使用我的视图模型和数据模板。这是我在我的 xaml 中尝试的: 然后:
    • 你还需要将ViewModel实例设置为View的DataContext。
    • 不,我不明白。如果我将 ContentPane 的 DataContext 设置为我的视图模型,我在哪里可以访问我的视图模型的 IsActiveTab?我尝试了类似: 但我不知道 IsActiveTab 应该去哪里......或者我是否正确设置了 datacontext,或者 是否应该在 ContentControl 中。跨度>
    【解决方案2】:

    我不知道 Infragistics 模型,如果这不合适,我深表歉意,但这是我使用常规项目控件实现此功能的方法 - 选项卡控件、列表框等。

    创建一个容器视图模型类,该类包含一个可观察的项目集合并公开一个SelectedItem 属性。使容器类成为项目控件的数据上下文。将项目控件的SelectedItem 属性绑定到容器类的。

    将项目对象与 容器PropertyChanged 事件挂钩。因此,现在当 UI 中的选定项目发生更改时,容器视图模型会通知所有 SelectedItem 已更改的项目。每个项目对象的事件处理程序都可以自行确定它现在是否是选定的项目。

    因此,项目对象不知道 UI 的任何实现细节 - 您可以在 UI 之外对类进行单元测试,并且逻辑仍然可以正常工作。

    【讨论】:

    • 这是一个有趣的想法,我也会探索它。我认为我仍然缺少有关如何使用数据上下文的信息,但我到了那里......
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2023-03-19
    • 2017-12-28
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多