我在应用MVVM模式时遇到了一些麻烦,首先我要按照这个例子来学习如何应用和使用模式......
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
所以我的问题是在View与ViewModel之间建立“连接”......
在示例中,我们有一个带有CollectionViewSource的View,其中Source是AllCustomers属性:
<UserControl
x:Class="DemoApp.View.AllCustomersView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase">
<UserControl.Resources>
<CollectionViewSource x:Key="CustomerGroups" Source="{Binding Path=AllCustomers}"/>
</UserControl.Resources>
<DockPanel>
<ListView AlternationCount="2" DataContext="{StaticResource CustomerGroups}" ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=DisplayName}"/>
<GridViewColumn Header="E-mail" DisplayMemberBinding="{Binding Path=Email}"/>
</GridView>
</ListView.View>
</ListView>
</DockPanel>
</UserControl>
谁属于ViewModel AllCustomersViewModel:
public class AllCustomersViewModel : WorkspaceViewModel
{
(...)
public ObservableCollection<CustomerViewModel> AllCustomers { get; private set; }
(...)
}
但他使用ResourceDictionary,他在View和ViewModel之间应用DataTemplate:
<DataTemplate DataType="{x:Type vm:AllCustomersViewModel}">
<vw:AllCustomersView />
</DataTemplate>
但我的问题是因为我没有使用ResourceDictionary,因为我认为我可以将DataTemplate放在Window的资源中,我将拥有我的View(对我来说,更多的逻辑放置是DataTemplate)...但由于某种原因,数据没有出现在ListView中,所以我问为什么?
答案 0 :(得分:4)
我不会在Xaml中附加视图模型。这会将Xaml硬编码为特定的视图模型。
相反,我会覆盖应用程序启动:
private void OnStartup(object sender, StartupEventArgs e)
{
Views.MainView view = new Views.MainView();
view.DataContext = new ViewModels.MainViewModel();
view.Show();
}
参见这篇文章:
http://www.codeproject.com/KB/WPF/MVVMQuickTutorial.aspx
如果您将来使用某种工具动态绑定视图模型,例如MEF,Castle.Windsor或Prism,这种方法也很有用。
答案 1 :(得分:1)
我永远不会将我的视图模型绑定到我在XAML中的视图。我更喜欢控制何时自己设置绑定。我总是在View上放置一个属性,其中包含对视图模型的引用。这样我就可以在需要的时候更改视图模型,而不会产生XAML绑定带来的任何毫无疑问的后果。另外,这样做可以让我在视图模型上放置一个INotify处理程序,以便在切换视图模型时自动更新所有更改。
答案 2 :(得分:0)
DataTemplates
的数据作为要显示的内容,都会隐式应用没有键的 DataType
。这意味着您的ViewModel需要显示在某个位置,例如ContentControl
的内容或ItemsControl
的项目。
因此,如果您有一个窗口,则需要在其中包含ViewModel的实例:
<Window ...>
<Window.Resources>
<DataTemplate DataType="{x:Type vm:AllCustomersViewModel}">
<vw:AllCustomersView />
</DataTemplate>
</Window.Resources>
<Window.Content>
<vm:AllCustomersViewModel />
</Window.Content>
</Window>
通常你只使用windows作为shell,并且动态设置内容。