我有一个简单的 wpf-mvvm 应用程序,您可以在其中创建和编辑记录。像这样:
如果您创建新记录,则会有“创建”和“取消”按钮。 如果您编辑现有记录,则有“编辑”、“删除”和“取消”按钮。
我不想使用两种不同的形式。我想使用一个,并创建一个动态菜单,我可以在其中选择哪些按钮可见。
现在的 xaml 是这样的:
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="93" Command="{Binding CreateCommand}>
Create
</Button>
<Button MinWidth="93" Command="{Binding EditCommand}>
Edit
</Button>
<Button MinWidth="93" Command="{Binding DeleteCommand}>
Delete
</Button>
<Button MinWidth="93" Command="{Binding CancelCommand}>
Cancel
</Button>
</StackPanel>
执行此操作的最佳方法是什么?
最佳答案
我遇到过类似的情况。有两种选择(至少,一如既往):
使用命令的 CanExecute 方法并让它们返回 true 或 false,具体取决于您要编辑的记录类型。 CanExecute
值切换它绑定(bind)到的控件的 IsEnabled
属性。这意味着,如果您想隐藏控件,您需要将 IsEnabled
值“推送”到 Visibility
值,例如通过使用样式触发器。
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</Trigger>
</Style.Triggers>
我想这将是标准方法,并且可能对您有意义。
我有更多的动态环境,想动态创建按钮。当您在 ViewModel 中定义 Collection of CommandViewModels 时,这很容易完成。 CommandViewModel 可以有一个显示在按钮中的名称属性和要执行的命令。然后您可以使用此集合来填充带有按钮的 ItemsControl。对你的情况来说可能有点矫枉过正,但它指的是你的问题的标题,也许你觉得它很有趣并且可以在某些时候使用它。
简而言之,ViewModels:
public class CommandViewModel : ViewModelBase
{
public ICommand Command { get { return ... } }
public string Name { get; set; }
}
public class MainViewModel : ViewModelBase
{
...
ObservableCollection<CommandViewModel> Commands { get; private set; }
public MainViewModel()
{
Commands = new ObservableCollection<CommandViewModel>();
// Creates the ViewModels for the commands you want to offer
PopulateCommands();
}
}
在 XAML 中看起来像这样:
<ItemsControl ItemsSource="{Binding Commands}"}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding Command}" Content="{Binding Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这样就形成了一个动态菜单...
玩得开心。
关于WPF:带按钮的动态菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15241448/