2017-06-13 7 views
0

row is nullは現在のコードで行全体の色を変更したいと思っていました。 datagrid.Rowsは存在しません。DataGridの色を変更する

たとえば、3 rd行を強調表示したいと思います。

var row = datagrid.ItemContainerGenerator.ContainerFromItem(3) as Microsoft.Windows.Controls.DataGridRow; 
row.Background = Brushes.Blue; 
+0

これはWPFですね。 –

+0

はい、それは....... –

+0

背景色は不動産などによって異なりますか?あなたはスタイルを使ってそれを試すことができます。 –

答えて

0

このような何かしてみてください?私はブール値が変更されるまで、白のままに(私の行内のブール値に応じて、背景色をバインドするために使用されるブール値をカリバーンマイクロを使用しています。この場合

<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Executed}" Value="False"> 
         <Setter Property="Background" Value="LightCoral" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Executed}" Value="True"> 
         <Setter Property="Background" Value="LightGreen" /> 
       </DataTrigger> 
      </Style.Triggers>  
    </Style> 
</DataGrid.RowStyle> 

を)。

+0

と私はどのように色の変化を引き起こすのですか?コード内。 –

+0

boolをfalseまたはtrueに設定します。 'private bool _executed; public bool実行済み { get => _executed; セット { _executed = value; NotifyOfPropertyChange(); } これは、caliburn microを使用してビューモデルから行う方法です。実行を設定すると、ビュー –

0

これは本当にDataGridRowの背景を変更するための最良の方法ではありません - @デビッドDanielewiczにより示唆されるように、あなたはStyleを使用する必要があります - しかし、動作するようにあなたの現在のアプローチのために、あなたはにメソッドから返されたオブジェクトをキャストする必要がありますシステム .Windows.Controls.DataGridRow。

また、ContainerFromIndexメソッドを使用して、4番目の要素のビジュアルコンテナへの参照を取得する必要があります。

datagrid.Loaded += (ss, ee) => 
{ 
    var row = datagrid.ItemContainerGenerator.ContainerFromIndex(2) as System.Windows.Controls.DataGridRow; 
    row.Background = Brushes.Blue; 
}; 
+0

が更新されます。 row = null –

+0

あなたは実際にこのコードをどこで実行しますか?コンテナが実際に作成されるまで待つ必要があります。 – mm8

+0

まあ、それはnullだが、コードはクラッシュしないと言います。 'steps.ItemContainerGenerator'をチェックすると、私はすべての項目を見ることができます。だから私はそれがテーブルからデータを取得していると確信しています。 –

0

を:

var row = datagrid.ItemContainerGenerator.ContainerFromIndex(2) as System.Windows.Controls.DataGridRow; 
row.Background = Brushes.Blue; 

はまた、これは機能するためには、あなたはコンテナが実際に作成されるまで待機する必要があることに注意してください:第3の要素は、これを試してみてください。2.

のインデックスを持っていますコードの背後からビューにアクセスすることは悪い習慣です。より良いMVVMの力を使用してください:

<Window> 
    <Window.Resources> 
     <ResourceDictionary> 
      <Style x:Key="DataGridRowStyle" TargetType="DataGridRow"> 
       <Setter Property="Background" Value="{Binding RowBackground}"/> 
      </Style> 
     </ResourceDictionary> 
    </Window.Resources> 
    <DataGrid ItemsSource="{Binding Records}" RowStyle="{StaticResource DataGridRowStyle}" AutoGenerateColumns="False" CanUserAddRows="False">   
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Value}" Width="*"/> 
     </DataGrid.Columns> 
    </DataGrid>  
</Window> 

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new MainWindowViewModel(); 
} 

public class MainWindowViewModel 
{ 
    public MainWindowViewModel() 
    { 
     Records.Add(new RecordViewModel() 
     { 
      Value = "Red", 
      RowBackground = new SolidColorBrush(Colors.LightCoral) 
     }); 

     Records.Add(new RecordViewModel() 
     { 
      Value = "Green", 
      RowBackground = new SolidColorBrush(Colors.LightGreen) 
     }); 

     Records.Add(new RecordViewModel() 
     { 
      Value = "Blue", 
      RowBackground = new SolidColorBrush(Colors.LightBlue) 
     }); 

     Records[2].Value = "Not blue anymore"; 
     Records[2].RowBackground = new SolidColorBrush(Colors.LightPink); 
    } 

    public ObservableCollection<RecordViewModel> Records { get; } = new ObservableCollection<RecordViewModel>(); 
} 

public class RecordViewModel : INotifyPropertyChanged 
{ 
    private string _value; 
    private Brush _rowBG; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Value 
    { 
     get 
     { 
      return _value; 
     } 
     set 
     { 
      _value = value; 
      OnPropertyChanged(nameof(Value)); 
     } 
    } 

    public Brush RowBackground 
    { 
     get 
     { 
      return _rowBG; 
     } 
     set 
     { 
      _rowBG = value; 
      OnPropertyChanged(nameof(RowBackground)); 
     } 
    } 

    private void OnPropertyChanged(string name) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
    } 
} 
関連する問題