我将ItemsControl
延长至允许MultiSelection
我将数据OneWayToSource
绑定到viewmodel。
根据鼠标事件,容器的IsSelected
属性都设置为true。
我看到数据从容器传播到viewmodel,IsSelected
更新。
当我逐步完成代码后,立即在PropertyChanged
完成后立即执行代码
第二次运行setter将属性设置为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 treeview不允许多选并实际取消选择所有项目,如果你试图在多个treeviewitems上设置isselected,所以我想知道itemscontrol是否有这种行为,即使它对于通用没有意义itemscontrol混乱选择。不知道发生了什么,但我最终会弄清楚
答案 0 :(得分:1)
ItemsControl
不允许按设计进行任何选择,因此当IsSelected
选择项目时,我不知道ItemsControl
被更改的含义。那件事根本没有选择。
此外,如果您想要多选行为,可以使用ListBox
并将SelectionMode
更改为
Multiple
或Extended
。
检查此链接:
http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selectionmode.aspx
答案 1 :(得分:0)
很抱歉,我把这么多人浪费在愚蠢的问题上。但通常我只想确认事情按照我认为的方式运作。当我的代码无效时,我对任何事都没有信心