C# 从ViewModel更改ListBox的SelectedItem

C# 从ViewModel更改ListBox的SelectedItem,c#,wpf,mvvm,.net-4.0,selecteditem,C#,Wpf,Mvvm,.net 4.0,Selecteditem,在ViewModel中设置SelectedItem后,如何突出显示列表框的SelectedItem ItemsSource绑定到Bar的observedcollection(该集合是类Foo的成员。按钮绑定到一个命令,该命令向集合添加一个新的空Bar实例,然后还将SelectedItem设置为新的空实例 将实例添加到集合后,列表框将更新,以显示新的空白栏。但是,在ViewModel中设置SelectedItem属性后,新实例不会在列表框中突出显示,而是正在设置,并引发PropertyChange

在ViewModel中设置
SelectedItem
后,如何突出显示
列表框的
SelectedItem

ItemsSource
绑定到
Bar
observedcollection
(该集合是类
Foo
的成员。按钮绑定到一个命令,该命令向集合添加一个新的空
Bar
实例,然后还将
SelectedItem
设置为新的空实例

将实例添加到集合后,
列表框
将更新,以显示新的空白
。但是,在ViewModel中设置
SelectedItem
属性后,新实例不会在
列表框
中突出显示,而是正在设置,并引发
PropertyChanged
事件(视图中的其他位置会显示
SelectedItem

其他详情:

INotifyPropertyChanged
在基本ViewModel类中实现,也在
Foo
Bar
类中实现

ListBox
包含一个自定义的
ItemTemplate
以显示
Bar
成员,以及一个自定义的
ItemContainerStyle
,用于修改
IsMouseOver
触发器的
背景

简化的xaml:

<ListBox ItemsSource="{Binding Path=MyFoo.BarCollection}"
         SelectedItem="{Binding Path=SelectedItem, 
                       UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

<Button Content="Add New Bar"
        Command="{Binding Path=AddBarCommand}"/>

你的代码对我来说非常有效

请注意“条3”被选中,但当列表框没有焦点时,Windows 7上的默认主题很难让您注意到。Windows 7甚至不是最差的。我们的应用程序使用
WhiteMoke
作为默认背景,我们遇到了一些主要问题,老用户1无法判断列表框项目是否被选中不是

幸运的是,这只是一个小问题。这些资源可以很容易地放在
窗口中。资源
、全局
列表框
样式或
App.xaml
中。应用它们的范围取决于您

<ListBox 
    ItemsSource="{Binding MyFoo.BarCollection}"
    SelectedItem="{Binding SelectedItem}"
    >
    <ListBox.Resources>
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
            Color="{x:Static SystemColors.HighlightColor}"
            Opacity="0.5"
            />
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" 
            Color="{x:Static SystemColors.HighlightTextColor}"
            />
    </ListBox.Resources>
</ListBox>

你的代码对我来说非常有效

请注意“条3”被选中,但当列表框没有焦点时,Windows 7上的默认主题很难让您注意到。Windows 7甚至不是最差的。我们的应用程序使用
WhiteMoke
作为默认背景,我们遇到了一些主要问题,老用户1无法判断列表框项目是否被选中不是

幸运的是,这只是一个小问题。这些资源可以很容易地放在
窗口中。资源
、全局
列表框
样式或
App.xaml
中。应用它们的范围取决于您

<ListBox 
    ItemsSource="{Binding MyFoo.BarCollection}"
    SelectedItem="{Binding SelectedItem}"
    >
    <ListBox.Resources>
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
            Color="{x:Static SystemColors.HighlightColor}"
            Opacity="0.5"
            />
        <SolidColorBrush 
            x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" 
            Color="{x:Static SystemColors.HighlightTextColor}"
            />
    </ListBox.Resources>
</ListBox>


BarCollection
的类型是什么?@Ed
BarCollection
是一个
可观察的集合
我认为它必须是。在这个假设下,你的代码对我来说运行得很好。是否有可能新项目被突出显示为真正的浅灰色,几乎无法从周围的窗口中分辨出来?默认的非焦点现代版本的windows中的ed highlight背景色可能很难被注意到。如果是这样,它很容易修复。@ed Ughh…是的!将列表框背景更改为白色,新添加的项目确实高亮显示为浅灰色。我想我将覆盖SystemColor笔刷?谢谢!BarCollection的类型是什么?@Ed
BarCollection
是一个
ObservableCollection
我认为它是必须的。在这个假设下,你的代码对我来说很好。有没有可能新项目以一种真正的浅灰色突出显示,几乎无法从它周围的窗口分辨出来?现代版本中默认的非聚焦突出显示背景色很难注意到windows的错误。如果是这种情况,它很容易修复。@Ed ugh…是的!将列表框背景更改为白色,新添加的项目确实高亮显示为浅灰色。我想我将覆盖SystemColor笔刷?谢谢!正是我遇到的问题。谢谢修复!标记为答案。(很抱歉对+1)NP了解不够,很高兴提供帮助。重写
InactiveSelectionHighlightBrushKey
成功了,尽管它破坏了VS2010中的设计器。也可以说,“笔刷的
IsFroze
属性为true,因此无法修改。”这是一个需要担心的问题吗?您不是在更改笔刷资源;您只是在一个更本地的范围内使用相同的键创建一个新的笔刷资源,所以
FindResource()
(或者实际执行此任务的任何内容)将首先找到您的,然后停止查找。不过,破坏设计器是很不幸的。对于其他停留在较旧的.NET框架上的人,我遇到过这样的情况:“如果系统只有.NET FW 4.0,当系统使用InactiveSelectionHighlightBrushKey创建用户控件时,将引发异常。”他们建议在LostFocus/LostKeyboardFocus/GotFocus的处理程序中设置颜色。这正是我遇到的问题。感谢修复!标记为答案。(抱歉对+1)NP知之甚少,很乐意提供帮助。覆盖
InactiveSelection HighlightBrushKey
成功,尽管它破坏了VS2010中的设计器。还说,“笔刷的
IsFrozed
属性为true,因此无法修改。”这是否需要担心?您不是在更改笔刷资源;您只是在更局部的范围内使用相同的键创建一个新的笔刷资源,所以
FindResource()
(或者实际执行此任务的任何内容)将首先找到您的,然后停止查找。不过,破坏设计器是很不幸的。对于其他停留在较旧的.NET框架上的人,我遇到过这样的情况:“如果系统只有.NET FW 4.0,当系统使用InactiveSelectionHighlightBrushKey创建用户控件时,将引发异常。“他们建议在LostFocus/LostKeyboardFocus/GotFocus的处理程序中设置颜色。
<ListBox
    >
    <ListBox.ItemContainerStyle>
        <Style 
            TargetType="ListBoxItem" 
            BasedOn="{StaticResource {x:Type ListBoxItem}}"
            >
            <Style.Setters>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid
                                Background="{TemplateBinding Background}"
                                >
                                <ContentPresenter />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter 
                        Property="Background" 
                        Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}" 
                        />
                    <Setter 
                        Property="Foreground" 
                        Value="{StaticResource {x:Static SystemColors.HighlightTextBrushKey}}" 
                        />
                </Trigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsSelected" Value="True" />
                        <Condition Property="IsEnabled" Value="False" />
                    </MultiTrigger.Conditions>
                    <Setter 
                        Property="Background" 
                        Value="{StaticResource {x:Static SystemColors.InactiveCaptionBrushKey}}" 
                        />
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>