WPF: 动态菜单和按钮

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

什么是最好的方法来做到这一点?

我发布了一个答案,你是否正在使用MVVM框架?你有访问诸如DelegateCommand之类的命令吗?(这是一种你可以创建的命令,便于传递方法/lambda来轻松执行和CanExecute操作) - Alan
2个回答

3
我有类似的情况。至少有两种选择:

使用命令的CanExecute方法,并根据您想要编辑的记录类型返回true或false。 CanExecute值切换其绑定控件的IsEnabled属性。这意味着,如果您想隐藏控件,则需要将IsEnabled值“推送”到Visibility值,例如使用样式触发器。

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

我想这应该是标准的方法,对你来说也很有意义。


我的情况比较动态,我希望能够动态创建按钮。当你在ViewModel中定义一个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>

那样可以生成动态菜单...
玩得愉快。

0
如果你正在使用 MVVM,那么你有一个 ViewModel 作为你的 DataContext,其中包含创建、编辑、删除和取消命令。
让你的 ViewModel 拥有一条记录的实例。如果要编辑它,请传入要编辑的实例。否则,用 null 设置为创建记录。
创建您的命令,并使 CanExecute 功能检查传入的记录是否为空。(null 代表创建新记录,否则为编辑)。如果将您的命令的 CanExecute 设置为 false,则与其绑定的按钮将自动禁用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接