0

バックグラウンド:

ItemSourceタイプにバインドされた DataGrid がありますObservableCollection<Dictionary<string, object>>。この背後にある考え方は、DataGrid がさまざまなソースからの一連のオブジェクトを表示できるようにすることです (これはログ収集プログラムであるため、フィールドはすべてログの種類ごとに異なります)。私は動作を通じて列の生成を処理したので、実行時まで列がどうなるかわかりません。

問題:

別の列からの並べ替え順序を維持しながら、フィールド (列) に基づいてエントリ間の共通性を示す方法が必要です。これを行うために、色分けシステムを使用することを考えていました。columnA の下の cellA の値が columnA の cellB の値と一致した場合、セルが属する 2 つの行は、両方のセルで見つかった値に対して同じ一意の色を取得します。ユーザーは、列をカラー コードに変更することもできます。

目的の効果を得るためにスタイルを操作しようとしていますが、いくつかの問題があります。これが問題のコードです。

MainWindow.xaml

<DataGrid...>
   <DataGrid.CellStyle>
      <Style TargetType="DataGridCell">
         <Setter Property="Background">
            <Setter.Value>
               <MultiBinding Converter="{StaticResource RowBackgroundConverter}">
                  <MultiBinding.Bindings>
                     <Binding RelativeSource="{RelativeSource Self}"/>
                     <Binding Path="ColumnName"/>
                     <Binding Path="."/>
                  </MultiBinding.Bindings>
               </MultiBinding>
            </Setter.Value>
         </Setter>
      </Style>
   </DataGrid.CellStyle>
</DataGrid>

行背景コンバーター

/// <summary>
/// A converter that changes the background of a DataGrid based on a cell value
/// </summary>
public class RowBackgroundConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values[0] is DataGridCell)
        {
            DataGridCell cell= (DataGridCell)values[0];
            string columnName = (string)values[1];
            Dictionary<string, object> dataGridValues = (Dictionary<string, object>)values[2];

            // Check the cell's column name and compare it against the desired column name (columnName) Get the index of the value and get the mapped brush. (dataGridValues[columnName]) 

            return new SolidColorBrush(ColorMap.ColorDictionary[0]);

        }

        return SystemColors.AppWorkspaceColor;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

私のViewModelには、目的の列を色分けするためのColumnNameプロパティがあります。

問題は、マルチバインディングのコンテキストがデータ グリッド セルである場合に、ビュー モデルのプロパティに到達するにはどうすればよいかということです。

4

1 に答える 1

1

あなたの質問を正しく理解した場合、バインディングの相対ソースをウィンドウに設定することで、ColumnName プロパティにアクセスできるはずです。

これは、ウィンドウの DataContext が、ColumnName プロパティを含む ViewModel に設定されていることを前提としています。

このようなものが動作するはずです:

{Binding Path=DataContext.ColumnName, 
         RelativeSource={RelativeSource AncestorType=Window}}
于 2012-09-24T20:58:46.607 に答える