WPF CanExecute从未调用过CommandParameter DataGrid SelectedItem

时间:2015-03-26 16:22:10

标签: c# wpf xaml mvvm datagrid

我正在尝试将CommandParameter绑定到DataGrid的SelectedItem属性。 实际上,该方法在Window调用时只调用一次。

这就是我通常使用的Silverlight 5,它运行得非常好。

<Button Command="{Binding DeleteProductCommand}" CommandParameter="{Binding ElementName=ProductDataGrid, Path=SelectedItem}"/>
...
<sdk:DataGrid x:Name="ProductDataGrid" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding ProductsCollection}">
...

我在下面的post中读到了SL和WPF之间处理命令的方式。这实际上是4岁。所以我只是想知道微软是否发布了这个问题的更新。

为了解决这个问题,我必须在我的命令中添加一个名为RaiseCanExecuteChanged的自定义方法来触发CanExecuteChanged事件。 然后我在ViewModel中添加了一个属性。我从set访问器调用RaiseCanExecuteChanged方法。 然后我在ViewModel中实现了INotifyPropertyChanged接口,以在SelectedProduct属性更改时警告UI。

class MainVM : INotifyPropertyChanged
{
    private Product _SelectedProduct;
    public Product SelectedProduct
    {
        get
        {
            return this._SelectedProduct;
        }
        set
        {
            this._SelectedProduct = value;
            this._PropertyChanged();
            this.DeleteProductCommand.RaiseCanExecuteChanged();
        }
    }

    private void _PropertyChanged([CallerMemberNameAttribute] string PropertyName = "")
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    ...
}

XAML

<Button Command="{Binding DeleteProductCommand}" CommandParameter="{Binding SelectedProduct"/>
...
<sdk:DataGrid x:Name="ProductDataGrid" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding ProductsCollection}" SelectedItem="{Binding SelectedProduct}">

我想知道是否有更好的解决方案。 实际上我从前面提到的帖子中尝试了解决方案但是我对UI有轻微的滞后,因为它刷新了Window的所有绑定。

非常感谢任何帮助!

0 个答案:

没有答案