[英]Dynamic menu WPF MVVM
谁能解释一下如何在 WPF 中创建动态菜单(使用 MVVM)? 首先,我在屏幕的一半(相机、锅炉、传感器)显示三个带有设备的按钮。 该应用程序对每个按钮都有特殊的命令。 例如,如果我按下一个按钮相机 - 我会在屏幕的第二部分显示一个相机屏幕。 如果我按下锅炉按钮 - 我会显示锅炉屏幕而不是相机屏幕。
我已经完成了,但是对于每个设备,我都在我的 XAML 中单独完成了。
<StackPanel>
<Button Content="Camera"
Command="{Binding NavigationCameraCommand}"
Margin="5"
Height="30"/>
<Button Content="Boiler".../>
</StackPanel>
<ContentControl Grid.Column="1" Content="{Binding CurrentViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type viewmodels:CameraViewModel}">
<views:CameraView/>
</DataTemplate>
...
</ContentControl>
但是如果我添加一个新设备,我必须在主窗体中重写代码,因此我想动态地进行。 我在主视图模型中创建了设备集合并尝试在 XAML 中使用这个集合。
<ItemsControl ItemsSource="{Binding Devices}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Path=Name}"
Command="{?}}}"
Margin="5" Height="30"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是我不知道如何将命令绑定到按钮。我的主视图模型中有三个命令(OpenCemeraScreenCommand、OpenBoilerScreenCommand、OpenSensorScreenCommand),它在静态菜单中没有任何问题,但我不知道如何使用它在动态菜单中...
有几种方法可以解决这个问题,但最“MVVM”的方法可能是创建一个 DeviceViewModel 来包装您的设备类并具有一个 OpenCommand。 然后,不是绑定到设备集合,而是绑定到 DeviceViewModel 集合。
DeviceViewModel 将类似于:
public class DeviceViewModel : INotifyPropertyChanged
{
private _device;
public Device Device
{
get { return _device; }
set
{
_device = value;
OnPropertyChanged("Device");
}
}
public ICommand OpenScreenCommand
{
get
{
return new RelayCommand(OpenScreen, CanOpenScreen)
}
}
private void OpenScreen(object param)
{
// open screen here
}
private bool CanOpenScreen(object param)
{
return true; // or whatever conditions you have...
}
}
并且您的 Xaml 将如下所示:
<ItemsControl ItemsSource="{Binding DeviceViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Path=Device.Name}"
Command="{Binding Path=OpenScreenCommand}"
Margin="5" Height="30"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.