WPF:带按钮的动态菜单

标签 wpf button mvvm menu

我有一个简单的 wpf-mvvm 应用程序,您可以在其中创建和编辑记录。像这样:

example

如果您创建新记录,则会有“创建”和“取消”按钮。 如果您编辑现有记录,则有“编辑”、“删除”和“取消”按钮。

我不想使用两种不同的形式。我想使用一个,并创建一个动态菜单,我可以在其中选择哪些按钮可见。

现在的 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/

相关文章:

wpf - 为什么只有 Silverlight for WP7 有合成线程?

java - 来自动态 SWT 按钮的 ActionEvent

c# - MVVM 模式中的去抖动事件/命令

java - 动态添加彼此相邻的按钮-RelativeLayout

java - 带图像的 android 按钮

c# - 验证与焦点丢失

wpf - 使用枚举值在组合框中添加其他项目

c# - 如何在 WPF 中设置新窗口的默认大小?

wpf - 动态改变 FocusManager.FocusedElement

c# - 在不同行中添加具有不同值的 DataGrid 复选框列