2013-03-06 101 views
3

我有一個簡單的wpf-mvvm應用程序,您可以在其中創建和編輯記錄。事情是這樣的:WPF:帶按鈕的動態菜單

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> 

什麼是做到這一點的最好方法是什麼?

+0

我發佈了一個答案,你使用的是MVVM框架嗎?你有權訪問各種DelegateCommand嗎? (你可以創建一個命令來輕鬆地爲Execute和CanExecute傳入一個方法/ lambda表達式) – Alan 2013-03-06 07:43:30

回答

2

我有過類似的情況。有兩種選擇(至少一如既往):


使用命令的CanExecute方法,讓他們返回true或false,這取決於你想要編輯記錄的類型。 CanExecute值切換了它所綁定的控件的IsEnabled屬性。這意味着,如果要隱藏控件,則需要將IsEnabled值「推」到Visibility值,例如通過使用樣式觸發器。

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

這將是標準的方法,我猜,並且可能對您有意義。


我有更多的動態環境,並希望動態地創建按鈕。當您在ViewModel中定義一個CommandViewModel集合時,可以輕鬆完成此操作。 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。 (null表示創建新記錄,否則編輯)。如果將命令的CanExecute設置爲false,綁定到它的按鈕將被自動禁用。