MVVM绑定查看特定的DataType

时间:2014-03-20 08:50:41

标签: wpf mvvm architecture

我想知道如何将View特定数据类型从ViewModel绑定到View。

更具体地说,我将ContextMenu作为DatagridView的一部分。现在我可以将ContextMenu的ItemSource绑定到MenuItems列表或字符串列表(< =在此实现转换器)。

这两个选项都运行良好,但我想知道哪个是最好的,为什么。我问的是因为我已经读过我应该尝试不使用System.Windows。*我的ViewModel中的命名空间,当我绑定一个MenuItems列表当然我使用这个命名空间但是另一方面如果我绑定字符串而且只是转换它...这感觉很奇怪。

SampleCode(使用Caliburn):

<DataGrid x:Name="OverviewItems">
    <DataGrid.ContextMenu>
        <ContextMenu ItemsSource="{Binding AllColumns, Converter={StaticResource String_Menu_Converter}}" >
        <!-- Alternative: <ContextMenu ItemsSource="{Binding AllColumns}" >-->
            <ContextMenu.ItemContainerStyle>
                <Style>
                    <Setter Property="cal:Message.Attach" Value="[Event Click]=[SetVisibilityExecute($_clickeditem)]" />
                </Style>
            </ContextMenu.ItemContainerStyle>
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>

1 个答案:

答案 0 :(得分:2)

在WPF中,我们操纵数据对象,而不是 UI对象。所以你的视图模型中不应该有任何UI对象。解决此问题的正确方法是在视图模型中操作数据对象,然后我们可以使用我们在DataTemplate中声明的UI控件进行数据绑定。因此,在您的情况下,您可以拥有一组自定义对象,这些对象具有绑定到MenuItem.Header属性的属性,另一个属性绑定到MenuItem.Command属性,例如:

<DataTemplate DataType="{x:Type YourPrefix:YourCustomType}">
    <MenuItem Header="{Binding Header}" Command="{Binding Command}" />
</DataTemplate>

...

<Menu ItemsSource="{Binding YourCustomTypeCollection}" />