MVVM命令绑定

本文关键字:绑定 命令 MVVM | 更新日期: 2023-09-27 18:01:39

我正在使用MVVM模式开发一个WPF应用程序。我有一个带有两个控件的窗口:一个用户控件和一个按钮。按钮的Command属性绑定到用户控件VM上的RelayCommand(来自MVVM Light)。下面是xaml:

<local:TraceChartView x:Name="chartView"/>
<Button Content="Copy To Clipboard" 
        Command="{Binding ElementName=chartView, 
                          Path=DataContext.CopyToClipboardCommand}"/>   

所以点击"CopyToClipboard"按钮在TraceChartView的VM中执行CopyToClipboardCommand RelayCommand。这工作得很好,但它需要我使用一个复杂的机制来获得命令从VM到tracecharview的代码背后,它可以实际实现的动作。似乎我应该能够在tracecharview的代码中实现依赖属性,并将按钮动作直接绑定到它,即:

<local:TraceChartView x:Name="chartView"/>
<Button Content="Copy To Clipboard" 
        Command="{Binding ElementName=chartView, 
                          Path=CopyToClipboardCommand}"/>   

我尝试了这个和一堆变化,但没有运气。有什么办法可以做到吗?

编辑:

我尝试用依赖属性做这个。下面是tracecharview背后的代码:

private static readonly DependencyProperty CopyToClipboardCommandProperty =   
    DependencyProperty.Register("CopyToClipboardCommand",
                                typeof(ICommand),
                                typeof(TraceChartView),
                                new FrameworkPropertyMetadata(null, OnSomePropertyChanged));
private static void OnSomePropertyChanged(DependencyObject d, 
                                          DependencyPropertyChangedEventArgs e)
{
    // never called
}
public ICommand CopyToClipboardCommand
{
    set
    {
        this.SetValue(CopyToClipboardCommandProperty, value);
    }
    get
    {
        return (ICommand)this.GetValue(CopyToClipboardCommandProperty);
    }
}

我试过这样绑定:

<local:TraceChartView x:Name="chartView"/>
<Button Content="Copy To Clipboard" 
        Command="{Binding ElementName=chartView, 
                          Path=CopyToClipboardCommand}"/>   

这不会产生任何控制台错误,但是我的回调永远不会被调用。

MVVM命令绑定

我的代码的问题是,我创建了一个依赖属性,但我从来没有设置任何属性。当我在构造函数中这样做时,它工作了:

public TraceChartView()
{
    InitializeComponent();
    CopyToClipboardCommand = new RelayCommand(DoCopyToClipboard);
}

对于我的实现,我真的不需要依赖属性,整个事情可以在后面的一行代码中实现:

public RelayCommand CopyToClipboardCommand { get { return new RelayCommand(DoCopyToClipboard); } }
xaml:
<local:TraceChartView x:Name="chartView"/>
<Button Content="Copy To Clipboard" 
    Command="{Binding ElementName=chartView, 
                      Path=CopyToClipboardCommand}"/>

我希望这将帮助其他一些WPF初学者。