【问题标题】:WPF ListView select added item when moving between list viewsWPF ListView 在列表视图之间移动时选择添加的项目
【发布时间】:2017-11-10 02:20:14
【问题描述】:

我有一个视图,其中有 2 个列表视图绑定到从我的视图模型上的 ObservableCollections 创建的 CollectionViewSources。

每个列表视图项都被模板化为一个文本块和一个按钮 - 使用 unitsInMeasureListView.ItemTemplate 按钮绑定到一个命令,以从其绑定集合中删除该项目并将其添加到 availableUnitsListView 上的集合中。

availableUnitsListView.ItemTemplate 按钮的情况正好相反 - 它会将其从 availableUnitsListView 中移除并将其添加到 unitsInMeasureListView。

这一切都很好,项目会根据需要从每个列表视图中删除和添加。

当unitsInMeasureListView 仍然有焦点时,我是否可以自动选择添加到availableUnitsListView 的项目?

XAML:

 <CollectionViewSource x:Key="unitsInMeasureViewSource" Source="{Binding Path=MeasureUnits}">
                <CollectionViewSource.SortDescriptions>
                    <componentModel:SortDescription PropertyName="UnitInMeasure.IsPredefined" Direction="Descending" />
                    <componentModel:SortDescription PropertyName="UnitInMeasure.Name"  />
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
            <CollectionViewSource x:Key="availableUnitsViewSource" Source="{Binding Path=AvailableUnits}">
                <CollectionViewSource.SortDescriptions>
                    <componentModel:SortDescription PropertyName="UnitInMeasure.IsPredefined" Direction="Descending" />
                    <componentModel:SortDescription PropertyName="UnitInMeasure.Name"  />
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>

<ListView Grid.Row="1" x:Name="unitsInMeasureListView" BorderThickness="1" BorderBrush="Gray" VerticalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Source={StaticResource unitsInMeasureViewSource}}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <Border Margin="0 3" >
                                    <DockPanel>
                                        <TextBlock x:Name="unitItem" DockPanel.Dock="Left" Height="20" VerticalAlignment="Center" >
                                            <TextBlock.Text>
                                                <MultiBinding StringFormat=" {0} ({1})" >
                                                    <Binding Path="UnitInMeasure.Name" />
                                                    <Binding Path="UnitInMeasure.Symbol" />
                                                </MultiBinding>
                                            </TextBlock.Text>
                                            <TextBlock.Style>
                                                <Style>
                                                    <Style.Triggers>
                                                        <DataTrigger Binding="{Binding Path=UnitInMeasure.IsPredefined}" Value="false">
                                                            <Setter Property="TextBlock.FontStyle" Value="Italic"/>
                                                        </DataTrigger>
                                                    </Style.Triggers>
                                                </Style>
                                            </TextBlock.Style>
                                                <TextBlock.InputBindings>
                                                    <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}, Path=DataContext.EditUnitCommand}" CommandParameter="{Binding Path=UnitInMeasure}" />
                                                </TextBlock.InputBindings>
                                        </TextBlock>
                                        <Button Command="{Binding Path=RemoveUnitFromMeasureCommand}" DockPanel.Dock="Right" HorizontalAlignment="Right" Style="{StaticResource TransparentStyle}" >
                                            <Button.Visibility>
                                                <MultiBinding Converter="{StaticResource multiBindingToVisibilityConverter}">
                                                    <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
                                                    <Binding Path="IsMeasureEditable"/>
                                                    <Binding Path="CanRemoveUnit" />
                                                </MultiBinding>
                                            </Button.Visibility>
                                            <Image Source="../../Images/Small/navigate_minus.png" ToolTip="Remove unit from measure" >
                                                <Image.Visibility>
                                                    <MultiBinding Converter="{StaticResource multiBindingToVisibilityConverter}">
                                                        <Binding Path="IsFocused" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
                                                    </MultiBinding>
                                                </Image.Visibility>
                                            </Image>
                                        </Button>
                                    </DockPanel>
                                </Border>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>                        
<ListView Grid.Row="3" x:Name="availableUnitsListView" BorderThickness="1" BorderBrush="Gray" VerticalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Source={StaticResource availableUnitsViewSource}}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <Border Margin="3" >
                                    <DockPanel>
                                        <TextBlock  x:Name="measure" Height="20" VerticalAlignment="Center">
                                                <TextBlock.Text>
                                                    <MultiBinding StringFormat=" {0} ({1})" >
                                                        <Binding Path="UnitInMeasure.Name" />
                                                        <Binding Path="UnitInMeasure.Symbol" />
                                                    </MultiBinding>
                                                </TextBlock.Text>
                                                <TextBlock.Style>
                                                    <Style>
                                                        <Style.Triggers>
                                                            <DataTrigger Binding="{Binding Path=UnitInMeasure.IsPredefined}" Value="false">
                                                                <Setter Property="TextBlock.FontStyle" Value="Italic"/>
                                                            </DataTrigger>
                                                        </Style.Triggers>
                                                    </Style>
                                                </TextBlock.Style>
                                        </TextBlock>
                                        <Button Command="{Binding Path=AddUnitToMeasureCommand}" DockPanel.Dock="Right" HorizontalAlignment="Right" Style="{StaticResource TransparentStyle}" >
                                            <Button.Visibility>
                                                <MultiBinding Converter="{StaticResource multiBindingToVisibilityConverter}">
                                                    <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
                                                    <Binding Path="IsMeasureEditable"/>
                                                </MultiBinding>
                                            </Button.Visibility>
                                            <Image Source="../../Images/Small/navigate_plus.png" ToolTip="Add unit to measure"  >
                                                <Image.Visibility>
                                                    <MultiBinding Converter="{StaticResource multiBindingToVisibilityConverter}">
                                                        <Binding Path="IsFocused" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
                                                    </MultiBinding>
                                                </Image.Visibility>
                                            </Image>
                                        </Button>
                                    </DockPanel>
                                </Border>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>

View Model 上的绑定集合是:

    /// <summary>
    /// Gets a list of all unit view models currently within this measure.
    /// </summary>
    public ReadOnlyObservableCollection<UnitInMeasureViewModel> MeasureUnits
    {
        get
        {
            return this._measureUnits;
        }
    }
    private readonly ReadOnlyObservableCollection<UnitInMeasureViewModel> _measureUnits;
    private readonly ObservableCollection<UnitInMeasureViewModel> measureUnits;

    /// <summary>
    /// Gets a list of all unit view models currently available to this measure.
    /// </summary>
    public ReadOnlyObservableCollection<UnitInMeasureViewModel> AvailableUnits
    {
        get
        {
            return this._availableUnits;
        }
    }
    private readonly ReadOnlyObservableCollection<UnitInMeasureViewModel> _availableUnits;
    private readonly ObservableCollection<UnitInMeasureViewModel> availableUnits;

以及按钮命令绑定执行的视图模型代码:

    /// <summary>
    /// Adds a unit to this measure.
    /// </summary>
    /// <param name="vm">The view model for the unit to be added.</param>
    internal void AddUnitToMeasure(UnitInMeasureViewModel vm)
    {
        this.availableUnits.Remove(vm);
        this.measureUnits.Add(vm);
    }

    /// <summary>
    /// Removes a unit from this measure.
    /// </summary>
    /// <param name="vm">The view model for the unit to be removed.</param>
    internal void RemoveUnitFromMeasure(UnitInMeasureViewModel vm)
    {
        this.measureUnits.Remove(vm);
        this.availableUnits.Add(vm);
    }

【问题讨论】:

    标签: c# wpf listview


    【解决方案1】:

    将 ListBox 中的 SelectedItem 绑定到 View Model 中的某个属性(比如 X)。 每当您从 ListBox 中添加或删除项目(AddUnitToMeasure 方法和 RemoveUnitFromMeasure 方法)时,您还需要更新此 X 属性以更新 ListBox 中的选定项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      相关资源
      最近更新 更多