删除后面的UserControl代码以用于MVVM

时间:2014-01-17 13:21:05

标签: wpf mvvm wpf-controls caliburn.micro

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

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

此时,我们将非常感谢任何想法或建议。

谢谢, 埃里克

3 个答案:

答案 0 :(得分:1)

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

如果你使用datatemplate你的视图知道如何渲染这个viewmodel

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这很容易。

假设你有:

MyUserControlView.xaml

MYUserControlViewModel.cs

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

MyMainWindowViewModel.cs - 您的MainWindow ViewModel。

你想绑定List<string> 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(google it,你会得到大量的例子)和OnPropertyChanged事件
  • 您可以阅读DataTemplates它们在数据绑定中非常有用。

你可以找到这个usefeul:

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

我确定到底了! 祝你好运。