我需要在左边设计一个带有树视图的表单,在剩下的区域中设置一个用于其他控件的容器。每当用户在树视图中选择一个项目时,右侧会出现一些自定义控件。例如,假设树视图包含值“音频设置”和“视频设置”,我有两个控件可以绑定到这些设置,我想在需要时在表单上显示它们。
现在,从我读过的有关MVVM的内容来看,我不应该有返回UserControls或DataTemplates的属性,对吗?正如我所看到的那样,“VM不应该知道视图的实现细节”。那么,我如何在MVVM方面正确处理这种情况呢?我是否可以使用转换器,如果是这样,它看起来怎么样?
我目前无法提供任何代码(主要是因为没有代码),但如果需要,我会尝试澄清问题。 提前谢谢。
答案 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>
AudioView
和VideoView
为UserControls
。
如您所见,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。