セルの値が含まれる ObservableCollection の最小値または最大値であるかどうかに基づいて、データグリッド セルの色を変更しようとしています。
これで、次のデータグリッドとスタイル テンプレートができました。
<Grid ItemsSource="{Binding myData.myObsCollection}">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding Converter="{StaticResource myValidConverter}">
<Binding Path="mdTime" /> //myObsCollection doesn't work here
<Binding Path="mdisValid" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>...
コレクションは簡略化されていますが、次の要素で構成されています。
public class myClass : INotifyPropertyChanged
{
...
public ObservableCollection<myData> myObsCollection { get; set; }...
public class myData
{
public int mdTime { get; set; }
public bool mdisValid { get; set; }...
これは現在、「mdisValid」ブール値に応じてセルの色の値を変更しますが、これは問題ありません。動作を拡張したいのですが、現在のセル値の mdTime がコレクション全体で最も低い場合は、データグリッドをバインドしてから、色を別のものに変更します。
valueconverter は mainwindow と同じ名前空間にありますが、MainWindow メソッド内にはありません。ViewModel にデータバインドされた MainWindow があり、データバインドは同じくらい甘いです。
valueconverter 内からコレクションにアクセスする方法がわかりません。親ウィンドウのデータコンテキストを取得しようとしましたが、何も機能していないようです。私は数時間にわたって valueconverters についてすべて読んできましたが、すべての例で同じ基本的なアプローチに従っているようです。それらのどれも、呼び出された valueconverter メソッドの外部のデータにアクセスしていないようで、コレクション全体をコンバーターに渡す方法を理解できません。
私はそれが私が見落とした単純なものだと確信しています...
編集: sa_ddam の回答に加えて、このコードをスタイルに追加しました:
<Binding RelativeSource="{RelativeSource Self}"/>
そしてこれをコンバーターに:
SolidColorBrush _brush = new SolidColorBrush(Colors.White);
var cell = (DataGridCell)values[2];
string columnName = cell.Column.Header.ToString();
switch (columnName)
{
case "mdTime":
return collection.Min(x => x.mdTime).Equals(collection[0].mdTime)
? new SolidColorBrush(Colors.LimeGreen)
: _brush;
break;
case "mdTime2":
return collection.Min(x => x.mdTime2).Equals(collection[0].mdTime2)
? new SolidColorBrush(Colors.LimeGreen)
: _brush;
break;...
columnName は、セルが含まれる列の実際のテキスト名を返すようになりました。それから、私が持っている列に対してこれでスイッチを実行するだけです。
最小色の変更が 1 つの行にのみ適用されるように、テーブルを更新する次のものを確認する必要があります。つまり、これがコレクション内の最小値である場合は、1 つの色にする必要があり、それ以外の場合は常に別の色になります。コレクションに追加すると、古い色の値が適用され、新しい行の各セルに Min クエリが適用されます。ゆっくりとそこに着きます;-)
編集 #2: したがって、collection[0] は明らかにコレクションの最初であり、実際に位置 0 に挿入するため、常に最後に追加するデータになります。これに対して Min 値をチェックすることは、追加した現在の行ですが、他の行ではありません。グリッドは実際にはまったく更新する必要がなかったので、実際には何もしない RelayCommands で時間を無駄にしました。実際、彼らは私がロジックに問題があることを示したので、完全に時間を無駄にしたわけではありません;-)
この単純なコマンドを追加すると、問題のアイテムの実際のデータが返されます。
var cellData = cell.DataContext as myData;
次に、クエリを少し変更すると、すべてを希望どおりに取得できます。
return collection.Min(x => x.mdTime).Equals(cellData.mdTime)
sa_ddam のおかげで、彼は最初の部分をくれました。
ウェブ上には「簡単な」チュートリアルがたくさんあるようですが、この複雑なセットアップをカバーするものは何もないので、他の人に役立つことを願ってこれを残します. それがあなたを助けるかどうか私に知らせてください...