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}"/>
这不会产生任何控制台错误,但是我的回调永远不会被调用。
我的代码的问题是,我创建了一个依赖属性,但我从来没有设置任何属性。当我在构造函数中这样做时,它工作了:
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初学者。