WPF DataGridを使用して、セルオブジェクトプロパティの関連する値に基づいて、DataGridCellのさまざまな表示および関連するプロパティ(Foreground、FontStyle、IsEnabledなど)を変更する必要があります。
これは、たとえば(ObservableDictionariesのObservableコレクションを使用して)コードで簡単に実行できます。
var b = new Binding("IsLocked") { Source = row[column], Converter = new BoolToFontStyleConverter() };
cell.SetBinding(Control.FontStyleProperty, b);
正常に動作しますが、セルオブジェクトのプロパティにパスを設定する方法が見つからないため、XAMLでこれを行う方法がわかりません。
XAMLの試みの1つは次のとおりです。
<Setter Property="FontStyle">
<Setter.Value>
<MultiBinding Converter="{StaticResource IsLockedToFontStyleConverter}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
ただし、IsLockedプロパティへのバインドはありません
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var row = (RowViewModel) values[0];
var cell = (DataGridCell) values[1];
if (cell != null && row != null)
{
var column = DataGridMethods.GetColumn(cell);
return row[column].IsLocked ? "Italic" : "Normal";
}
return DependencyProperty.UnsetValue;
}
以前のバージョンはrow[col].IsLockedを返し、DataTriggerを使用してFontStyleを設定しましたが、返されたオブジェクトはデータバインドされていないことに注意してください。
もちろん、アプリケーションは設計時に列が何であるかを認識していないことに注意してください。
最後に、DataTableは私の要件にはあまりにも非効率的ですが、とにかくDataTableでこれがどのように行われるかを確認したいと思います。そのようなソリューションがあれば、他の場所で役立つ可能性があります(ただし、コレクションを使用することをお勧めします)。
確かにこれは一般的な問題であり、私はプロジェクトですべてのMVVMを実行しようとしているWPF初心者ですが、この問題はWPFDataGridの使用に関して私を妨げています。