2013-06-14 2 views
0

TreeViewGrid 사이의 일종의 관계를 만들어야하는 WPF 응용 프로그램 MVVM 패턴에서 작업하고 있습니다. 아이디어는 id가 treenode id 인 행을 강조 표시하는 것입니다. 강조 표시 색 속성을 호출 : C# - WPF highlighted DataGrid의 선택된 행

디스플레이 색상 속성

public Brush DisplayColor 
    { 
     set 
     { 
      _displayColor = value; 
      NotifyPropertyChanged("DisplayColor"); 
     } 

     get { return _displayColor; } 

    } 

선택의 TreeNode는

// 그리드에서 아이디와 일치하는 검색

 public void SearchGrid(int id, ObservableCollection<MessageFieldViewModel> msgField) 
    { 
     if (msgField.Any()) 
      DisplayColor = msgField.Last().Id == id ? Brushes.CadetBlue : Brushes.Black; 
    } 

XAML

private MessageElementViewModel _selectedMessageElement; 
    public MessageElementViewModel SelectedMessageElement 
    { 
     set 
     { 
      if (_selectedMessageElement == value) return; 
      this._selectedMessageElement = value; 
      SearchGrid(value.Id, messageFields); 

     } 
     get 
     { 
      return this._selectedMessageElement; 
     } 

    } 

을 value.id 일치하는 ID. 데이터 그리드

트 리뷰 : 트 리뷰 선택 항목 뒤에

 <TreeView Margin="644,137,6,6" Grid.RowSpan="2" ItemsSource="{Binding MessageElements[0].Children[0].Children, Mode=TwoWay}" 
        SelectedItemChanged="TreeView_OnSelectedItemChanged" 
       SelectedValuePath="Id"> 

코드;

readonly MainWindowModel _mainWindowModel = new MainWindowModel(); 

    private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     if (_mainWindowModel != null) 
      _mainWindowModel.SelectedMessageElement = (MessageElementViewModel)e.NewValue; 
    } 

편집 :

<DataGrid Name="Datagrid" ItemsSource="{Binding MessageFields}" Margin="4,0,380,6" Grid.Row="2" AutoGenerateColumns="False" IsReadOnly="True" SelectedValue="{Binding SelectedMessageField}" 
        AlternatingRowBackground ="{Binding Path=DisplayColor}" RowBackground="{Binding Path=DisplayColor}" Background="CadetBlue"> 
      <DataGrid.Columns > 
       <DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="*" />  <!--Foreground="{Binding Path=DisplayColor}--> 

       <DataGridTextColumn Header="Code" Binding="{Binding Code}" Width="*" /> 
       <DataGridTextColumn Header="Field Name" Binding="{Binding Name}" Width="*" /> 
       <DataGridTextColumn Header="Position" Binding="{Binding Position}" Width="*" /> 
       <DataGridTextColumn Header="Length" Binding="{Binding Length}" Width="*" /> 
</DataGrid.Columns> 

왜 내 표시 색 속성 ID를 일치 작동하지 않습니다이다?

+0

어디서나 'DisplayColor' 속성에 바인딩되어 있지 않습니다. 전체 XAML을 게시하십시오. 또한 검색은'for'가 아닌'Linq'이어야합니다. –

+0

원래의 게시물을 업데이트하여 displayColor 호출을 표시했습니다. –

+0

@HighCore linq로 업데이트했지만 아무 것도 작동하지 않습니다. 내 원래 게시물을 업데이 트 –

답변

0

내가이 문제를 해결할 방법을 찾은 것 같지만 코드 뒤에서 코드를 사용하고 있기 때문에 싫어합니다. 내 VM에서 할 수 있다면 좋을 것입니다.

private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 

     foreach (MessageFieldViewModel item in Datagrid.ItemsSource) 
     { 
      if (_mainWindowModel != null) 
       _mainWindowModel.SelectedMessageElement = (MessageElementViewModel) e.NewValue; 


      foreach (MessageFieldViewModel rowItem in Datagrid.ItemsSource) 
      { 
       var row = Datagrid.ItemContainerGenerator.ContainerFromItem(rowItem) as DataGridRow; 
       if (_mainWindowModel.SelectedMessageElement != null) 
        if (rowItem.Id == _mainWindowModel.SelectedMessageElement.Id) 

         row.Background = _mainWindowModel.DisplayColor; 

        else 
        row.Background = Brushes.White; 

      } 
     } 


    } 
1

당신은 단순히 트리거

XAML

<DataGrid.Resources> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Setter Property="Background" Value="Red"/><!--default color--> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding DisplayColor}" Value="Black"> 
        <Setter Property="Background" Value="Black"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding DisplayColor}" Value="CadetBlue"> 
        <Setter Property="Background" Value="CadetBlue"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.Resources> 

이 제안 사용할 수 있습니다 귀하의 Datagrid.ItemsSourceList<MyClass> 당신의 MyClass 다음 Property

public string DisplayColor //don't use Brush 
{ 
    set 
    { 
     _displayColor = value; 
     NotifyPropertyChanged("DisplayColor"); 
    } 

    get { return _displayColor; } 

} 

자세한 설명을 포함하는 것입니다 HERE

+0

@ninja downvoter 몇 가지 의견이 있으십니까? – WiiMaxx

+0

나는 이것을 시도하고 작동합니다. WiiMaxx에 동의합니다. 스타일 트리거가 필요하며 viewmodel에서 많은 코드를 정리합니다. – Pat

관련 문제