【问题标题】:WPF: dynamic menu with buttonsWPF:带按钮的动态菜单
【发布时间】:2013-02-20 21:29:53
【问题描述】:

我有一个简单的 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>

最好的方法是什么?

【问题讨论】:

  • 我发布了一个答案,您使用的是 MVVM 框架吗?您可以访问各种 DelegateCommand 吗? (您可以创建一个命令以轻松地为 Execute 和 CanExecute 传递方法/lambda)

标签: wpf button mvvm menu


【解决方案1】:

我也遇到过类似的情况。有两种选择(至少,一如既往):


使用命令的CanExecute 方法并让它们返回真或假,具体取决于您要编辑的记录类型。 CanExecute 值切换它绑定到的控件的IsEnabled 属性。这意味着,如果您想隐藏控件,您需要将IsEnabled 值“推”到Visibility 值,例如通过使用样式触发器。

<Style.Triggers>
    <Trigger Property="IsEnabled" Value="False">
        <Setter Property="Visibility" Value="Hidden"/>
    </Trigger>
</Style.Triggers>

我猜这将是标准方法,并且可能对您有意义。


我有更多动态的情况,想动态地创建按钮。当您在 ViewModel 中定义 CommandViewModels 集合 时,这很容易做到。 CommandViewModel 可以具有您在按钮中显示的名称属性和您要执行的命令。然后,您可以使用此集合来填充带有按钮的 ItemsControl。对于您的情况可能有点矫枉过正,但它指的是您的问题的标题,也许您觉得它很有趣并且可以在某个时候使用它。

简而言之,ViewModel:

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>

这是一个动态菜单...


玩得开心。

【讨论】:

    【解决方案2】:

    如果您使用的是 MVVM,那么您有一个 ViewModel,它是您的 DataContext,其中包含创建、编辑、删除和取消命令。

    让您的 ViewModel 有一个记录实例。如果您编辑它,请传入要编辑的实例。否则用于创建一个为空的记录集。

    创建您的命令并让 CanExecute 功能检查传入的记录是否为空。 (null 代表创建新记录,否则编辑)。如果将命令的 CanExecute 设置为 false,则绑定到它的按钮将自动禁用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多