2009-12-09 37 views
6

Khi tôi cập nhật dữ liệu SelectedItem từ mã (thông qua một đối tượng bị ràng buộc trong một ViewModel), làm thế nào để tôi nhận được lưới hình ảnh để làm nổi bật mục mới được chọn?Silverlight DataGrid Cập nhật SelectedItem từ mã

Cảm ơn,
Đánh dấu

UPDATE: này vẫn là một vấn đề đối với tôi. Thuộc tính SelectedItem của tôi đã triển khai thông báo thay đổi, nhưng dữ liệu không phải là VISUALLY hiển thị hàng nào đã được chọn - nghĩa là nó không được tô sáng.

Trả lời

3

Tôi đoán rằng bạn thực sự xác nhận rằng SelectedItem đã thay đổi (bạn có thể thiết lập chế độ Binding để TwoWay tạm thời để xem nếu nó hoạt động theo chiều ngược lại, bằng cách nhấn vào liên tiếp bạn sẽ thấy nổi bật và SelectedItem 's set -method execute). Nếu có, hãy xác minh rằng bạn thực sự khớp chính xác với tên thuộc tính trên phương thức gọi PropertyChanged. Vì bạn không an toàn ở đây, bạn có thể đã mắc lỗi chính tả. Nếu không, hãy kiểm tra xem thuộc tính Databinding của bạn có được đặt chính xác hay không. Một ý tưởng khác là bạn có thể đã thay đổi kiểu hoặc mẫu của DataGrid và bây giờ bạn đang thiếu một số trong số Visual States. DataGridRow có thể được tạo kiểu bằng cách sử dụng mẫu kiểu. Bạn có ba trạng thái được chọn, được gọi là UnfocusedSelected (có thể là đúng), NormalSelectedMouseOverSelected.

Bạn có thể cố gắng làm cho Nhà nước trực quan của riêng bạn bằng cách sử dụng mẫu này:

<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> 

Đây là một copy-paste từ một tốt MSDN Article về tùy chỉnh Styles DataGrid. Ví dụ, bạn có thể sửa đổi phần UnfocusedSelected của mẫu và xem liệu bạn có thấy bất kỳ thay đổi nào khi, ví dụ: thêm đường viền màu đỏ xung quanh mẫu hay gì đó không.

Có thể đáng để thử. Tôi hy vọng rằng bạn biết cách áp dụng phong cách riêng. Nếu không, đây là một số khác MSDN Resource.

Tôi biết, đây chỉ là mẹo, nhưng có thể hữu ích sau cùng.

0

Bạn cần triển khai giao diện INotifyPropertyChanged trên ViewModel của mình và có thuộc tính SelectedItem gọi sự kiện PropertyChanged khi giá trị của nó thay đổi.

+0

Tôi có INotifyPropertyChanged và đang thiết lập giá trị của thuộc tính đã gọi sự kiện PropertyChanged. –

Các vấn đề liên quan