【问题标题】:WPF Commands - how to consume in user controlWPF 命令 - 如何在用户控件中使用
【发布时间】:2011-10-27 08:03:31
【问题描述】:

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

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

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

有没有办法可以从嵌套在我的主窗口中的用户控件中使用这些相同的命令?

【问题讨论】:

    标签: .net wpf user-controls


    【解决方案1】:

    是的,通过绑定:

    <Button Command="{Binding MyCommand}" />
    

    如果它是一个用户控件,只需让它公开一个ICommand 类型的依赖属性。此外,MyCommand 必须在 ViewModel 内。

    编辑:
    假设您有一个 Button 嵌套在您的 UserControl 中:

    <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”设置为您的 UserControl 的名称,我们暂时称它为 Bob。

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

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

    “my”当然是定义用户控件的 xmlns 命名空间。
    并且 MyCommand 必须在您的 ViewModel 中定义,也就是您作为视图的 DataContext 放置的对象。
    你可以在整个网络上找到它,但归结为创建一个实现INotifyPropertyChanged 的类,向它添加一个ICommand,然后在 Window 的构造函数中:

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

    【讨论】:

    • 我目前没有使用 MVVM。您能否提供一些关于如何实现这一点的说明(+链接?)?
    • 好的,我会编辑我的答案。但是您确实需要为您的视图设置一个 DataContext 才能使用绑定。
    • 只是试图实现这一点。在主窗口中定义用户控件的地方,设置用户控件的命令属性 = "{Binding MyCommand}" - "MyCommand" 是在 Window.CommandBindings 集合中定义的命令的名称吗?如果您不介意澄清 MyCommand 的定义位置,我们将不胜感激。
    • MyCommand 是 ICommand 类型的公共属性的名称,它应该在作为 XAML 的 DataContext 的对象集中。
    【解决方案2】:

    是的,你可以。您必须在您的用户控件中将命令绑定到该命令。

    【讨论】:

    • 与我发布的代码如此相似,但在用户命令中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2012-09-11
    • 2010-10-08
    • 2011-02-05
    • 2011-08-16
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多