MVVM方式使用不同的控件来编辑不同的对象

时间:2011-02-14 10:22:47

标签: wpf mvvm wpf-controls binding

我需要在左边设计一个带有树视图的表单,在剩下的区域中设置一个用于其他控件的容器。每当用户在树视图中选择一个项目时,右侧会出现一些自定义控件。例如,假设树视图包含值“音频设置”和“视频设置”,我有两个控件可以绑定到这些设置,我想在需要时在表单上显示它们。

现在,从我读过的有关MVVM的内容来看,我不应该有返回UserControls或DataTemplates的属性,对吗?正如我所看到的那样,“VM不应该知道视图的实现细节”。那么,我如何在MVVM方面正确处理这种情况呢?我是否可以使用转换器,如果是这样,它看起来怎么样?

我目前无法提供任何代码(主要是因为没有代码),但如果需要,我会尝试澄清问题。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

这是WPF模板系统帮助的地方。

主要想法是让ContentControl根据TreeView中的选定值显示相应的视图。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
    <DockPanel>

        <ListBox DockPanel.Dock="Left" ItemsSource="{Binding Editors}" SelectedItem="{Binding SelectedEditor}" />

        <ContentControl Content="{Binding SelectedEditor}">
            <ContentControl.Resources>
                <DataTemplate DataType="{x:Type l:VideoViewModel}">
                    <l:VideoView />
                </DataTemplate>
                <DataTemplate DataType="{x:Type l:AudioViewModel}">
                    <l:AudioView />
                </DataTemplate>
            </ContentControl.Resources>
        </ContentControl>

    </DockPanel>
</Window>

AudioViewVideoViewUserControls

如您所见,ContentControl的内容绑定到ViewModel中的SelectedEditor属性,该属性也绑定到Listbox的SelectedItem。

因此主视图的ViewModel看起来像这样。

public class MainWindowViewModel : INotifyPropertyChanged
{
    public IEnumerable<object> Editors
    {
        get
        {
            yield return new VideoViewModel();
            yield return new AudioViewModel();
        }
    }

    private object selectedEditor;
    public object SelectedEditor
    {
        get { return selectedEditor; }
        set
        {
            if (selectedEditor == value)
                return;
            selectedEditor = value;
            OnPropertyChanged("SelectedEditor");
        }
    }
}

因此,您可以看到主ViewModel中没有GUI数据。

要处理将TreeView连接到ViewModel中的SelectedItem属性,请参阅Data binding to SelectedItem in a WPF Treeview

答案 1 :(得分:1)

您可以实现它抛出两个属性:ViewModel中的ShowAudioSettings和ShowVideoSettings,并在控件的Visibility上绑定它。

此外,您可以使用VisualStateManager