代码之家  ›  专栏  ›  技术社区  ›  Mark Cooper

Silverlight数据报从代码更新SelectedItem

  •  6
  • Mark Cooper  · 技术社区  · 15 年前

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

    谢谢,
    作记号

    更新: 这对我来说仍然是个问题。我的SelectedItem属性已实现更改通知,但DataGrid不是 视觉上 显示选定的行-即不突出显示。

    2 回复  |  直到 13 年前
        1
  •  3
  •   Tim Cooper    13 年前

    我想你 真正地 确认 SelectedItem 已更改(您可以设置 Binding 模式到 TwoWay 暂时查看它是否以相反的方式工作,通过单击行,您应该看到突出显示和 选择项目 set -方法已执行)。如果是,请确认 真正地 与上的属性名完全匹配 PropertyChanged 方法调用。既然你在这里打字不安全,你可能犯了一个拼写错误。如果不是,请检查数据绑定属性是否设置正确。另一个想法是你可能改变了 DataGrid 的样式或模板,现在您缺少 视觉状态 . 这个 DataGridRow 可以使用样式模板设置样式。您有三个选定状态,调用 UnfocusedSelected (可能是正确的一个) NormalSelected MouseOverSelected .

    您可以尝试使用此模板来创建自己的视觉状态:

    <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 Article 自定义数据报样式。例如,您可以修改 未聚焦选定 作为模板的一部分,并查看在添加红色边框或其他内容时是否看到任何更改。

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

    我知道,这些只是小贴士,但最终可能会有所帮助。

        2
  •  0
  •   AnthonyWJones    15 年前

    你需要实现 INotifyPropertyChanged 在视图模型上的接口 SelectedItem 属性调用 PropertyChanged 当其值更改时的事件。