0

我扩展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 是否有这种行为,即使它对通用没有意义项目控制弄乱选择。不知道发生了什么,但我最终会弄清楚的

4

2 回答 2

1

ItemsControl不允许任何设计选择,所以我不知道您在选择项目IsSelected时更改的意思。ItemsControl那东西根本没有选择。

此外,如果您想要多选行为,您可以使用ListBox并更改SelectionModeMultipleor Extended

检查此链接:

http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selectionmode.aspx

于 2013-10-30T07:30:33.450 回答
0

终于找到了。只是一个愚蠢的地方,我有另一个绑定设置错误。交互绑定会导致奇怪的行为。很可能是一个更新触发了一个再次关闭它的循环。

对不起,我用愚蠢的问题浪费了这么多人的时间。但通常我只是想确认事情是否按照我认为的方式进行。当我的代码不起作用时,我对任何事情都没有信心

于 2013-10-30T19:29:52.603 回答