在ListView中同步IsSelected和SelectedItem

时间:2012-06-21 20:15:45

标签: .net wpf mvvm

我在WPF控件中有一些图像(位置)。每个图像都与该控件下方ListView中的项目相关联。当用户点击某个位置时,我希望在ListViewItem中选择相应的ListView(并因此突出显示)。同样,当用户点击ListViewItem时,我希望选择相应的位置。

我可以完成一种行为或另一种行为,但我似乎无法让两者一起工作。

我有一个Style,在选择一个位置时将IsSelected属性设置为“true”:

<Style x:Key="PositionItem" TargetType="ListViewItem">
    <Setter Property="IsSelected" Value="False" />
    <Style.Triggers>
        <DataTrigger Value="True">
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource IsCurrentPositionConverter}">
                    <Binding RelativeSource="{RelativeSource Self}" Path="DataContext" />
                    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" Path="DataContext.CurrentBackplane.CurrentCard.CurrentPosition" />
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter Property="IsSelected" Value="True" />
        </DataTrigger>
    </Style.Triggers>
</Style>

在我的ListView中,我为SelectionChanged设置了处理程序:

private void Positions_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    var listView = sender as ListView;
    if (listView == null) return;
    var currentPos = listView.SelectedItem as IGraphicPositionViewModel;
    if (currentPos == null) return;
    if (currentPos != _ViewModel.CurrentBackplane.CurrentCard.CurrentPosition)
        _ViewModel.CurrentBackplane.CurrentCard.CurrentPosition = currentPos;
}

问题IsSelected的{​​{1}}属性似乎与ListViewItem的{​​{1}}属性无关。

我是否可以使用其他属性或事件来同步这些属性?

1 个答案:

答案 0 :(得分:0)

您需要定义包含属性SelectedPositionSelectedListItem的视图模型。然后,在其中一个属性的事件处理程序中,您应该更改另一个属性:

    private Position _selectedPosition;
    public Position SelectedPosition
    {
        get
        {
            return _selectedPosition;
        }
        set
        {
            if (_selectedPosition != value)
            {
                _selectedPosition = value;
                RaisePropertyChanged("SelectedPosition");
                _OnSelectedPositionChanged();
            }
        }
     }

     private void _OnSelectedPositionChanged()
     {
         _selectedListItem = ... ; // find corresponding item in the list
         RaisePropertyChanged("SelectedListItem"); // update selection of the ListView
     }

应在SelectedListItem事件处理程序中使用类似的代码。