在项目选择上处理ViewModel命令

时间:2019-10-22 11:44:41

标签: c# wpf listview viewmodel

我需要在我的command中某个项目的点击上触发一个ListViewEvent存在于ViewModel中,不应在后面的代码中实现。

我目前正在使用EventSetter处理该命令,该命令位于后面的代码中,但是我需要在ViewModel中使用它。

简而言之,我想在单击列表项后立即更改property1property2(在ViewModel中显示)的值。 请帮忙吗?

XAML

 <ListView.ItemContainerStyle>
        <Style TargetType= "ListViewItem">
           <EventSetter Event="PreviewMouseLeftButtonDown" Handler="MyCommand"/>
        </Style>
    </ListView.ItemContainerStyle>

代码隐藏:

private voide MyCommand(object sender, MouseButtonEventArgs e)
{
    ViewModel.property1 = true;
    ViewModel.property2 = false;
}

1 个答案:

答案 0 :(得分:2)

您的视图模型项应具有一个布尔属性,该属性指示是否已选择它。项的选择状态更改时需要执行的任何代码都可以在属性设置器中调用。

public class ViewModelItem : INotifyPropertyChanged
{
    private bool selected;

    public bool Selected
    {
        get { return selected; }
        set
        {
            selected = value;
            // fire PropertyChanged event
            // add call optional additional code here
        }
    }
}

您将ListViewItem的IsSelected属性绑定到ItemContainerStyle中的该属性:

<ListView.ItemContainerStyle>
    <Style TargetType= "ListViewItem">
        <Setter Property="IsSelected" Value="{Binding Selected}"/>
    </Style>
</ListView.ItemContainerStyle>

如果您具有单选ListView,并且仅在选定的单个项目发生更改时需要通知,请在主视图模型中添加适当的属性,然后在其setter中调用代码:

public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<ViewModelItem> Items { get; }
        = new ObservableCollection<ViewModelItem>();

    private ViewModelItem selectedItem;

    public ViewModelItem SelectedItem
    {
        get { return selectedItem; }
        set
        {
            selectedItem = value;
            // fire PropertyChanged event
            // add call optional additional code here
        }
    }
}

像这样绑定ListView的SelectedItem:

<ListView ItemsSource="{Binding Items}"
          SelectedItem="{Binding SelectedItem}" />