ItemsControl
許可するように拡張しましたMultiSelection
。
データをビューモデルにバインドしますOneWayToSource
。
コンテナーはすべてIsSelected
、マウス イベントに基づいてプロパティが true に設定されています。
データがコンテナからビューモデルに伝播し、IsSelected
更新されることがわかります。コードをステップ実行すると、 で完了しPropertyChanged
た直後に、プロパティを false に戻してセッターをもう一度実行します。何が起こっているのかとても混乱しています。プロパティを false にリセットする直前に、この非ユーザー コードをステップ実行します。
ステップ イン: 非ユーザー コード 'System.ComponentModel.PropertyChangedEventArgs.PropertyChangedEventArgs'
をステップ インします。 ステップ イン: 非ユーザー コード 'MS.Internal.Data.PropertyPathWorker.GetValue'
をステップ インします。 Internal.Data.PropertyPathWorker.RawValue'
ステップ イン: 非ユーザー コード 'MS.Internal.Data.PropertyPathWorker.RawValue'
をステップ イン: 非ユーザー コード 'MS.Internal.Data.ClrBindingWorker.RawValue'
をステップ イン: 非ユーザー コード 'System.Windows.Data.BindingExpression.TransferValue' をステップ オーバーしています
bool _IsSelected;
public bool IsSelected
{
get
{
return _IsSelected;
}
set
{
if (value != _IsSelected)
{
_IsSelected = (bool)value;
OnPropertyChanged("IsSelected");
}
}
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
この投稿ですべてを言ったことを覚えていないことを誓います。複数選択ツリービューを作成するために項目コントロールを拡張しています。私は実際には、他の人のコードで見つけたコードをほとんど使用し、キーボード ナビゲーションを許可するように調整しました。
<Rectangle
x:Name="Rectangle" Fill="Transparent" Stroke="Black"
StrokeDashCap="Square" StrokeThickness="0" SnapsToDevicePixels="True">
<Rectangle.StrokeDashArray>
<sys:Double>5</sys:Double>
</Rectangle.StrokeDashArray>
</Rectangle>
<Border Name="Bd"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
>
<ContentPresenter x:Name="PART_Header"
ContentSource="Header"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
/>
</Border>
<ItemsPresenter
x:Name="ItemsHost"
Grid.Row="1"
/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="false">
<Setter TargetName="ItemsHost"
Property="Visibility"
Value="Collapsed"
/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader"
Value="false"/>
<Condition Property="Width"
Value="Auto"/>
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header"
Property="MinWidth"
Value="75"
/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader"
Value="false"/>
<Condition Property="Height"
Value="Auto"/>
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header"
Property="MinHeight"
Value="19"/>
</MultiTrigger>
<Trigger Property="IsSelected"
Value="true">
<Setter TargetName="ItemMainGrid"
Property="Background"
Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsOutlined"
Value="true"
/>
<Condition Property="IsSelected"
Value="false"
/>
</MultiTrigger.Conditions>
<Setter TargetName="Rectangle" Property="StrokeThickness" Value="1" />
</MultiTrigger>
<Trigger Property="IsOutlined"
Value="false">
<Setter TargetName="Rectangle" Property="StrokeThickness" Value="0" />
</Trigger>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
とにかく最後には解ります。デフォルトのwpfツリービューでは複数選択が許可されておらず、複数のツリービューアイテムでisselectedを設定しようとすると実際にすべてのアイテムの選択が解除されることを覚えていると思いました。選択を台無しにするitemscontrol。何が起こっているのかわかりませんが、私は最終的にそれを理解します