我扩展ItemsControl
为允许MultiSelection
。
我将数据绑定OneWayToSource
到视图模型。
容器都IsSelected
根据鼠标事件将其属性设置为 true。
我看到数据从容器传播到视图模型并IsSelected
更新。当我单步执行代码时,在它完成后PropertyChanged
立即运行设置器第二次将属性设置回 false。我对正在发生的事情感到非常困惑。在将属性重置为 false 之前,它会逐步执行此非用户代码。
步入:步入非用户代码“System.ComponentModel.PropertyChangedEventArgs.PropertyChangedEventArgs”
步入:步入非用户代码“MS.Internal.Data.PropertyPathWorker.GetValue”
步入:步入非用户代码“MS. 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 是否有这种行为,即使它对通用没有意义项目控制弄乱选择。不知道发生了什么,但我最终会弄清楚的