【问题标题】:Removing UserControl code behind for use with MVVM删除用于 MVVM 的 UserControl 代码
【发布时间】:2014-01-17 13:21:04
【问题描述】:

我正在尝试使用 MVVM 创建用户控件。 基本上我正在尝试包装一个组合框,该组合框将从存储库中提取数据。这将允许我在我的应用程序的许多不同视图中使用相同的组合框。整个应用程序中会有许多包装好的组合框。

我可以使用 DependencyProperty 和代码隐藏轻松创建此控件。我现在正在尝试将其转换为 MVVM,并且无法弄清楚如何将值返回到/从绑定到我的组合框所在的 View 的 ViewModel 中。

此时任何想法或建议都将不胜感激。

谢谢, 埃里克

【问题讨论】:

  • 在使用 MVVM 时使用包含代码的UserControl 是完全可以接受的。如果您真的想将功能移出控件,则将其移至将使用它的父视图模型。如果担心的话,可以将其封装在一个可以重用的类中。
  • 谢谢。我想这就是我要走的路。
  • 在这种情况下,我已经添加了我稍微扩展的评论作为答案,所以这个 question can have an accepted answer 在这个网站上是习惯性的。

标签: wpf mvvm wpf-controls caliburn.micro


【解决方案1】:

在使用 MVVM 时使用包含代码的UserControl 是完全可以接受的。如果您真的想将功能移出UserControl,则将其移至需要它的任何父视图模型。如果您不想在多个地方重复相同的代码,您可以将其封装在一个类中,并将该类的一个实例作为属性添加到每个相关的视图模型中。

【讨论】:

    【解决方案2】:

    如果您有一个可以从存储库中提取数据的视图模型 - 您可以在应用程序的许多不同视图模型中使用相同的视图模型 :)

    如果你使用数据模板,你的视图知道如何渲染这个视图模型

     <DataTemplate DataType="{x:Type local:MyPullDataViewmodel}">
       <view:MyCoolPullDataShowComboboxUserControl />
     </DataTemplate>
    

    【讨论】:

      【解决方案3】:

      这很容易。

      假设你有:

      MyUserControlView.xaml

      MYUserControlViewModel.cs

      MyMainWindowView.xaml - 用于您的 MainWindow 视图(包含 UserControl 的视图)

      MyMainWindowViewModel.cs - 您的主窗口视图模型。

      你想绑定List&lt;string&gt; MyListToBind 并将代码隐藏完全留空。

      MyUserControlViewModel.cs

      public class MyUserControlViewModel
      {
      private List<string> _MyListToBind;
      public List<string> MyListToBind { get; set;}
      }
      

      MyMainWindowViewModel.cs

      public class MyUserControlViewModel
      {
      private MyUserControlViewModel _MyControlViewModel;
      public MyUserControlViewModel MyControlViewModel { get; set;}
      }
      

      MyMainWindowView.xaml

      <Window ...
      xmlns:my="clr-namespace:NamespaceContainingYourUserControlView>
      <my:MyUserControlView DataContext = "{Binding Path= MyControlViewModel}"/>
      </Window>
      

      MyUserControlView.xaml

      <UserControl ...>
      <DataGrid ItemsSource = "{Binding Path= MyListToBind}" .../>
      ...
      </DataGrid>
      </UserControl>
      
      • 这不支持 ViewModel 更新 View。为此,您必须像以前一样使用 DependencyProperties 而不是普通变量(就像我一样)或使用 INotifyPropertyChanged(谷歌搜索,您会得到大量示例)和 OnPropertyChanged 事件。
      • 您可以阅读DataTemplates,它们在数据绑定中非常有用。

      你可以找到这个有用的:

      http://www.youtube.com/watch?v=BClf7GZR0DQ

      我确实做到了! 祝你好运。

      【讨论】:

      • 我了解 INotifyPropertyChanged 的​​工作原理,并且了解如何将数据从 MainViewModel 绑定到 UserControlViewModel,但我不知道如何将 MainViewModel 中的属性绑定到UserControlView 的子控件(在您的示例中为数据网格)。我特别试图将组合框中项目列表的键绑定回 MainViewModel 中的正确属性。
      猜你喜欢
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2019-07-20
      • 2011-08-26
      相关资源
      最近更新 更多