【问题标题】:Synchronizing IsSelected and SelectedItem in a ListView在 ListView 中同步 IsSelected 和 SelectedItem
【发布时间】:2012-06-21 20:15:44
【问题描述】:

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

问题是ListViewItemIsSelected 属性似乎与ListViewSelectedItem 属性没有很好的相关性。

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

【问题讨论】:

    标签: .net wpf mvvm


    【解决方案1】:

    您需要定义具有属性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事件处理程序中应该使用类似的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 2010-11-27
      • 1970-01-01
      • 2011-01-18
      • 2011-02-06
      • 2023-04-06
      • 1970-01-01
      • 2010-12-15
      相关资源
      最近更新 更多