我有一個類似於this one的問題,但是在更詳細的情況下。我也嘗試使用Model View Viewmodel模式來實現解決方案。綁定到CheckBox並以MVVM方式執行命令
在MainView
,我有一個按鈕,它調用一個存儲在MainViewModel
中的命令(我們稱之爲Execute
)。我還希望在單擊鼠標左鍵時調用此命令(實際上,僅在Up
上),但僅當選中MouseUpCheckBox
時纔會調用該命令。
當我曾在視圖中的所有代碼,我做了靜態的Execute
結合,但隨後用ElementName
結合Window
(名爲w_window
)爲IsChecked
,並檢查在MouseLeftButtonUpEvent
處理程序中的屬性值。
XAML
<Button Command="{x:Static local:MainView.Execute}">
Execute
</Button>
<CheckBox IsChecked="{Binding ElementName=w_window, Path=ExecuteOnMouseUp}">
Execute on Mouse Up
</CheckBox>
C#
public MainView()
{
InitializeComponent();
this.CommandBindings.Add(new CommandBinding(Execute, ExecuteExecuted));
MyDesigner.AddHandler(UIElement.MouseLeftButtonUpEvent, new RoutedEventHandler((o, eventArgs) =>
{
if (ExecuteOnMouseUp)
{
Execute.Execute(null, this);
}
}), true);
}
#region ExecuteOnMouseUp
/// <summary>
/// ExecuteOnMouseUp Dependency Property
/// </summary>
public static readonly DependencyProperty ExecuteOnMouseUpProperty =
DependencyProperty.Register("ExecuteOnMouseUp", typeof(bool), typeof(MainView),
new FrameworkPropertyMetadata((bool)false));
/// <summary>
/// Gets or sets the ExecuteOnMouseUp property. This dependency property
/// indicates ....
/// </summary>
public bool ExecuteOnMouseUp
{
get { return (bool)GetValue(ExecuteOnMouseUpProperty); }
set { SetValue(ExecuteOnMouseUpProperty, value); }
}
#endregion
#region Execute
/// <summary>
/// The Execute command ....
/// </summary>
public static RoutedUICommand Execute
= new RoutedUICommand("Execute", "Execute", typeof(MainView));
private void ExecuteExecuted(object sender, ExecutedRoutedEventArgs e)
{
...
}
#endregion
我怎樣才能從端口我的觀點到視圖模型的代碼?我應該使用附屬物嗎?有沒有辦法將複選框的值綁定到Command
或CanExecute
處理程序中的參數?處理這種情況的慣用WPF/MVVM方式是什麼?
當我問這個問題時,我不熟悉CommandManager的想法(http://msdn.microsoft.com/en-us/magazine/cc188928.aspx)。我不知道這是否是WPF內置的,但它似乎相關,所以我想在這裏提到它。 – Pat 2013-08-21 17:46:00