我正在使用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}"/>
这不会产生任何控制台错误,但我的回调永远不会被调用。
答案 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初学者有所帮助。