MVVM命令绑定

时间:2014-05-02 23:55:34

标签: c# wpf xaml mvvm

我正在使用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}"/>   

所以点击&#34;复制到剪贴板&#34;按钮在TraceChartView的VM中执行CopyToClipboardCommand RelayCommand。这工作正常,但它需要我使用一个复杂的机制来从VM获取命令后面的TraceChartView代码,它可以实际执行操作。看起来我应该能够在TraceChartView的代码后面实现类似依赖属性的东西,并将按钮操作直接绑定到它,即:

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

我试过这个和一堆变化,但没有运气。有没有办法做到这一点?

编辑:

我尝试使用依赖属性执行此操作。这是后面的TraceChartView代码:

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}"/>   

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

1 个答案:

答案 0 :(得分:1)

我的代码的问题是我创建了一个依赖项属性,但我从未将该属性设置为任何东西。当我在构造函数中执行此操作时,它可以工作:

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初学者有所帮助。