我正在做一個MVVM的示例,並且遇到命令問題。我有一個Article類(具有ID,名稱,價格等),一個表示視圖模型的ArticleViewModel以及一個允許輸入文章數據的用戶控件(ArticleControl),並綁定到ArticleViewModel的屬性。此用戶控件具有保存命令的標識。WPF:使用在UserControl中綁定的命令
<UserControl.CommandBindings>
<CommandBinding x:Name="saveCmd"
Command="local:Commands.Save"
CanExecute="CommandBinding_CanExecute"
Executed="CommandBinding_Executed"/>
</UserControl.CommandBindings>
這是命令是如何定義的:
public class Commands
{
private static RoutedUICommand _save;
public static RoutedUICommand Save
{
get { return _save; }
}
static Commands()
{
InputGestureCollection saveInputs = new InputGestureCollection();
saveInputs.Add(new KeyGesture(Key.S, ModifierKeys.Control, "Ctrl+S"));
_save = new RoutedUICommand(
"Save",
"Save",
typeof(Commands),
saveInputs);
}
}
和命令綁定處理程序:
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
double baseprice = 0;
double.TryParse(ArticleBasePrice.Text, out baseprice);
e.CanExecute =
!string.IsNullOrEmpty(ArticleID.Text) &&
!string.IsNullOrEmpty(ArticleName.Text) &&
!string.IsNullOrEmpty(ArticleDescription.Text) &&
baseprice > 0;
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ArticleViewModel avm = (ArticleViewModel)DataContext;
if (avm != null && avm.Save())
{
ArticleID.Text = String.Empty;
ArticleName.Text = String.Empty;
ArticleDescription.Text = String.Empty;
ArticleBasePrice.Text = String.Empty;
}
}
現在,我把這個用戶控件的窗口上。當我按下Ctrl + S時,命令被執行。但是,我還在該窗口上放置了一個Save按鈕,位於此用戶控件的旁邊。當我點擊它時,我想執行相同的命令(並且我不想在託管用戶控件的窗口中執行另一個命令綁定)。
<StackPanel>
<local:ArticleControl x:Name="articleControl" />
<Button Name="btnSave"
Content="Save" Width="100"
HorizontalAlignment="Left"
Command="{???}"/> <!-- what should I put here? -->
</StackPanel>
但我不知道如何引用在用戶控件中定義的saveCmd。我嘗試了不同的事情,有些完全錯誤(它們在運行應用程序時拋出異常),有些沒有任何效果。
Command="{StaticResource saveCmd}"
Command="{StaticResource local:ArticleControl.saveCmd}"
Command="{x:Static local:Commands.Save}"
任何幫助表示讚賞。謝謝。
你能舉個例子嗎?我嘗試了爲按鈕設置'Command =「local:Commands.Save」'和'CommandTarget =「{Binding ElementName = ArticleUserControl}',但它不起作用。該按鈕一直處於禁用狀態。 – 2011-05-05 06:43:35
您也可以在按鈕上設置一個FocusManager.IsFocusScope = True。 – 2011-05-05 08:11:55
太好了,工作正常。 – 2011-05-05 08:25:22