无法应用MVVM模式

时间:2011-08-28 19:39:32

标签: wpf mvvm wpf-controls

我在应用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中,所以我问为什么?

3 个答案:

答案 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,并且动态设置内容。