2017-06-08 18 views
0

ビューモデルでObservableCollectionsから作成されたCollectionViewSourcesに2つのリストビューがバインドされたビューがあります。WPF ListViewリストビュー間を移動するときに追加項目を選択

各リストビューアイテムは、バインドされたコレクションからアイテムを削除してavailableUnitsListViewのコレクションに追加するコマンドにバインドするunitsInMeasureListView.ItemTemplateボタンを含むテキストブロックとボタンにテンプレート化されています。

availableUnitsListView.ItemTemplateボタンの逆はtrueです。これは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> 

ビューモデルにバインドされたコレクションは、次のとおりです。

/// <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); 
    } 

答えて

0

バインドのSelectedItem ListBoxでView Modelのいくつかのプロパティ(Xなど)に移動します。 ListBox(AddUnitToMeasureメソッドおよびRemoveUnitFromMeasureメソッド)にアイテムを追加または削除するときは、このXプロパティも更新して、ListBoxで選択したアイテムを更新する必要があります。

関連する問題