我正在使用MVVM进行示例,并遇到了命令问题。我有一个Article类(带有ID,Name,Price等属性),一个表示视图模型的ArticleViewModel,以及一个用户控件(ArticleControl),允许输入文章数据,并将其绑定到ArticleViewModel的属性。该用户控件具有保存命令的绑定。
<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 时,命令将被执行。但是,我还在该窗口中的此用户控件旁边放了一个保存按钮。当我单击它时,我希望执行相同的命令(并且我不想在托管用户控件的窗口中执行其他命令绑定)。
<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}
应用于按钮,但它并不起作用。按钮一直处于禁用状态。 - Marius Bancila