C# 从ViewModel更改ListBox的SelectedItem
在ViewModel中设置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
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
的类型是什么?@EdBarCollection
是一个可观察的集合
我认为它必须是。在这个假设下,你的代码对我来说运行得很好。是否有可能新项目被突出显示为真正的浅灰色,几乎无法从周围的窗口中分辨出来?默认的非焦点现代版本的windows中的ed highlight背景色可能很难被注意到。如果是这样,它很容易修复。@ed Ughh…是的!将列表框背景更改为白色,新添加的项目确实高亮显示为浅灰色。我想我将覆盖SystemColor笔刷?谢谢!BarCollection的类型是什么?@EdBarCollection
是一个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>