ビューモデルで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);
}