当我选择新的treeviewitem时,WPF ItemsControl将IsSelected重置为false

时间:2013-10-30 00:05:40

标签: c# wpf binding

我将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混乱选择。不知道发生了什么,但我最终会弄清楚

2 个答案:

答案 0 :(得分:1)

ItemsControl不允许按设计进行任何选择,因此当IsSelected选择项目时,我不知道ItemsControl被更改的含义。那件事根本没有选择。

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

检查此链接:

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

答案 1 :(得分:0)

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

很抱歉,我把这么多人浪费在愚蠢的问题上。但通常我只想确认事情按照我认为的方式运作。当我的代码无效时,我对任何事都没有信心