Silverlight DataGrid从代码中更新SelectedItem

时间:2009-12-09 17:12:29

标签: silverlight-3.0 datagrid highlighting selecteditem

当我从代码更新数据网格SelectedItem时(通过ViewModel中的绑定对象),如何让可视网格突出显示新选择的项目?

谢谢,
标记

更新:这对我来说仍然是一个问题。我的SelectedItem属性已经实现了更改通知,但是数据网格不是 VISUALLY 显示已选择哪一行 - 即它没有被突出显示。

2 个答案:

答案 0 :(得分:3)

我猜您确实已确认SelectedItem已更改(您可以暂时将Binding模式设置为TwoWay以查看其是否正常工作通过单击该行,您应该看到突出显示并SelectedItem的{​​{1}} - 方法已执行)。如果是,请验证确实set方法调用上的属性名称完全匹配。由于您在此处不是类型安全的,因此可能会出现拼写错误。如果不是,请检查您的数据绑定属性是否设置正确。另一个想法是你可能已经更改了PropertyChanged的样式或模板,现在你错过了一些视觉状态DataGrid可以使用样式模板进行样式设置。您有三种选定状态,称为DataGridRow(可能是正确的状态),UnfocusedSelectedNormalSelected

您可以尝试使用此模板制作自己的视觉状态:

MouseOverSelected

这是来自好MSDN Article的自定义DataGrid样式的复制粘贴。例如,您可以修改模板的<Style TargetType="local:DataGridRow"> <Setter Property="IsTabStop" Value="False" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="local:DataGridRow"> <localprimitives:DataGridFrozenGrid Name="Root"> <vsm:VisualStateManager.VisualStateGroups> <vsm:VisualStateGroup x:Name="CommonStates"> <vsm:VisualState x:Name="Normal"/> <vsm:VisualState x:Name="NormalAlternatingRow"> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="0"/> </Storyboard> </vsm:VisualState> <vsm:VisualState x:Name="MouseOver"> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To=".5"/> </Storyboard> </vsm:VisualState> <vsm:VisualState x:Name="NormalSelected"> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> </Storyboard> </vsm:VisualState> <vsm:VisualState x:Name="MouseOverSelected"> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> </Storyboard> </vsm:VisualState> <vsm:VisualState x:Name="UnfocusedSelected"> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> <ColorAnimation Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="(Fill).Color" To="#FFE1E7EC"/> </Storyboard> </vsm:VisualState> </vsm:VisualStateGroup> <vsm:VisualStateGroup x:Name="ValidationStates"> <vsm:VisualState x:Name="Valid"/> <vsm:VisualState x:Name="Invalid"> <Storyboard> <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Visibility"> <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/> </ObjectAnimationUsingKeyFrames> <DoubleAnimation Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> </Storyboard> </vsm:VisualState> </vsm:VisualStateGroup> </vsm:VisualStateManager.VisualStateGroups> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.Resources> <Storyboard x:Key="DetailsVisibleTransition"> <DoubleAnimation Storyboard.TargetName="DetailsPresenter" Storyboard.TargetProperty="ContentHeight" Duration="00:00:0.1" /> </Storyboard> </Grid.Resources> <Rectangle x:Name="BackgroundRectangle" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFBADDE9"/> <Rectangle x:Name="InvalidVisualElement" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFF7D8DB"/> <localprimitives:DataGridRowHeader Grid.RowSpan="3" Name="RowHeader" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> <localprimitives:DataGridCellsPresenter Grid.Column="1" Name="CellsPresenter" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> <localprimitives:DataGridDetailsPresenter Grid.Row="1" Grid.Column="1" Name="DetailsPresenter" /> <Rectangle Grid.Row="2" Grid.Column="1" Name="BottomGridLine" HorizontalAlignment="Stretch" Height="1" /> </localprimitives:DataGridFrozenGrid> </ControlTemplate> </Setter.Value> </Setter> </Style> 部分,看看是否看到任何更改,例如,在其周围添加红色边框等。

也许值得一试。我希望你知道如何应用自己的风格。如果没有,这是另一个MSDN Resource

我知道,这些只是提示,但最后可能会有所帮助。

答案 1 :(得分:0)

您需要在ViewModel上实现INotifyPropertyChanged接口,并使其SelectedItem属性在其值发生变化时调用PropertyChanged事件。