WPF 命令 - 如何在用户控件中使用

3

我希望将我的WPF应用程序的一些功能放入用户控件中,主要是为了减少主窗口中的混乱。

目前我在主窗口中定义了以下命令。这些命令被ToolBar项目和菜单项使用...

<Window.CommandBindings>
    <CommandBinding Command="Close" Executed="CloseCommandHandler" />
    <CommandBinding Command="local:AppCommands.OpenAttributes" Executed="OpenAttributesHandler" CanExecute="OpenAttributesCanExecute" />
</Window.CommandBindings>

有没有一种方法可以从我的主窗口内嵌的用户控件中使用这些相同的命令?
2个回答

4
是的,通过绑定可以实现:
<Button Command="{Binding MyCommand}" />

如果它是一个用户控件,只需使其公开类型为ICommand的依赖属性。此外,MyCommand必须在ViewModel中。 编辑:
假设您在UserControl中嵌套了一个Button
<UserControl x:Name="MyUc">
...
   <Button Command={Binding NestedCommand, ElementName=MyUc} />
...
</UserControl>

在用户控件的代码后台中,您需要将“NestedCommand”公开为依赖项属性:
#region NestedCommand
    public ICommand NestedCommand
    {
        get { return (ICommand)GetValue(NestedCommandProperty); }
        set { SetValue(NestedCommandProperty, value); }
    }

    // Using a DependencyProperty as the backing store for NestedCommand.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty NestedCommandProperty =
        DependencyProperty.Register("NestedCommand", typeof(ICommand), typeof(MyUserControlClassName), new UIPropertyMetadata(MyDefaultValue));
    #endregion

将"MyDefaultValue"设置为null,并将"MyUserControlClassName"设置为您的用户控件名称,我们称其为Bob。

现在当您使用该用户控件时,它将公开一个NestedCommand属性:

<Window>
...
<my:Bob NestedCommand="{Binding MyCommand}" />
...
</Window>

"my"是定义您的UserControls的xmlns命名空间。
而MyCommand必须在您的ViewModel中定义,即您放置为视图DataContext的对象。
您可以在网上找到有关此的所有信息,但归结为创建实现INotifyPropertyChanged的类,向其中添加一个ICommand,然后在窗口构造函数中:

public MyWindow()
{
...
   this.DataContext = new MyViewModel();
...
}

我目前没有使用MVVM。你能提供一些关于如何实现它的笔记(+链接)吗? - Remotec
好的,我会编辑我的回答。但是你确实需要为你的视图设置一个DataContext才能使用绑定。 - Louis Kottmann
只是尝试实现这个。在主窗口中定义用户控件时,您将用户控件的命令属性设置为 =“{Binding MyCommand}” - “MyCommand”是在Window.CommandBindings集合中定义的命令名称吗?如果您不介意澄清MyCommand的定义位置,那将不胜感激。 - Remotec
MyCommand是一个公共属性的名称,类型为ICommand,应该在您的XAML中设置为DataContext对象。 - Louis Kottmann

0

可以的。您需要在用户控件中将命令绑定到该命令。


与我发布的代码非常相似,但在用户命令内部吗? - Remotec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接