我有一个可工作的MouseLeftButtonUp绑定(bind),可以从View.cs中工作,但无法从Viewmodel.cs中工作。

XAML:

 <DataGrid x:Name="PersonDataGrid" AutoGenerateColumns="False"
     SelectionMode="Single" SelectionUnit ="FullRow"  ItemsSource="{Binding Person}"
     SelectedItem="{Binding SelectedPerson}"
     MouseLeftButtonUp="{Binding PersonDataGrid_CellClicked}" >

View.cs:
    private void PersonDataGrid_CellClicked(object sender, MouseButtonEventArgs e)
    {
        if (SelectedPerson == null)
            return;

        this.NavigationService.Navigate(new PersonProfile(SelectedPerson));
    }

从ViewModel.cs无法使用PersonDataGrid_CellClicked方法。我已经尝试阅读有关Blend System.Windows.Interactivity的内容,但是由于我在学习MVVM时想避免使用它,因此没有尝试过。

我尝试了DependencyProperty并尝试了RelativeSource绑定(bind),但是无法获取PersonDataGrid_CellClicked来导航到PersonProfile UserControl。

最佳答案

通过使用Blend System.Windows.Interactivity程序集,只要在VM中的已定义命令中未使用与 View 直接相关的逻辑,就不会违反任何MVVM原理,此处介绍如何将其与MouseLeftButtonUp事件一起使用:

<DataGrid>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonUp" >
                <i:InvokeCommandAction
                      Command="{Binding MouseLeftButtonUpCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>

并在ViewModel中定义MouseLeftButtonUpCommand:
private RelayCommand _mouseLeftButtonUpCommand;
    public RelayCommand MouseLeftButtonUpCommand
    {
        get
        {
            return _mouseLeftButtonUpCommand
                ?? (_mouseLeftButtonUpCommand = new RelayCommand(
                () =>
                {
                    // the handler goes here
                }));
        }
    }

关于c# - 如何重写DataGrid MouseLeftButtonUp绑定(bind)到MVVM?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27586538/

10-11 18:46