3

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

做这个的最好方式是什么?

4

2 回答 2

3

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


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

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

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


我有更多动态的情况,想动态地创建按钮。当您在 ViewModel 中定义一个CommandViewModel 集合时,这很容易做到。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>

这使得一个动态菜单......


玩得开心。

于 2013-03-06T07:47:12.083 回答
0

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

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

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

于 2013-03-06T07:41:23.347 回答