WPF DataGrid内DataGridCellにセルオブジェクトのプロパティのバインド
-
26-09-2019 - |
質問
は、様々な表示及びDataGridCellの関連するプロパティを変更する必要がセルオブジェクトプロパティの関連値に基づきます。
さて、これは、コード内で行うのは簡単である(たとえばObservableDictionariesの監視可能なコレクションを使用して):
var b = new Binding("IsLocked") { Source = row[column], Converter = new BoolToFontStyleConverter() };
cell.SetBinding(Control.FontStyleProperty, b);
私はセットのパスセルオブジェクトのプロパティへのへの道を見つけることができませんので、と罰金を動作しますが、しかし私は、XAMLでこれを行う方法を見ることができません。
一つのXAMLの試みは、次のとおりです。
<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;
}
以前のバージョンが行[COL] .IsLocked とDataTriggerを使用してのfontStyleを設定するが、返されたオブジェクトは、データバインドされていないことを返したことの注意。
メモはもちろん、アプリケーションが知らないというの列は、設計時には何か。
最後のDataTableのは、はるかに私の要件については、あまりにも非効率的であるが、私は(私が使用してコレクションを好むが)これは彼らのために、このような解決策がある場合、これは便利な他の場所かもしれないが、とにかくのDataTableで行われているかを確認するために興味があると思います。
確かにこれは共通の問題であり、私はWPFのnoobieは私のプロジェクトのすべてのMVVMを行くことにしようとしていますが、この問題は、WPFのDataGridを使用してに関して戻って私を保持されます。
解決
さて、ここで私が見つけた最も簡単な解決策です。 (実は私はここで何もを聞いていない私はこれと他の質問を投稿する前にそれをしていたが、このようなsolution.Sinceでembarrasedたし、ちょうどそれは場合には他の誰が同じ問題に直面しているされて、私はそれを共有するだろうと思いました。)
DataGridCellのTagプロパティでセルオブジェクトへの参照を置きます。次のように私は、XAMLとコンバータ内部結合コードの組み合わせでこれを行う:
<Setter Property="Tag">
<Setter.Value>
<MultiBinding Converter="{StaticResource CellViewModelToTagConverter}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
と
public class CellViewModelToTagConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var row = values[0] as RowViewModel;
var cell = values[1] as DataGridCell;
if (row != null && cell != null)
{
var column = DataGridMethods.GetColumn(cell);
// hack within hack!!! (using tag way is itself a hack?)
var b = new Binding("Self") {Source = row[column]};
cell.SetBinding(FrameworkElement.TagProperty, b);
//...
//return row[column];
return DependencyProperty.UnsetValue;
}
return DependencyProperty.UnsetValue;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
あなたが、私はコンバータ内部の私のコメントで、この解決策を考える何を伝えることができます。(私はCellオブジェクトにセルフプロパティを追加し、自己がコンストラクタでこれを=しなければならなかった)。
あなたは、私は、コンバータの内部でやっていることMVVMと一致していることを受け入れる場合、 -まだそれは私のデータグリッドが完全にMVVMであることをコーディングできます。とにかくそれは働く!
だから、私が見ると、そのような(DataGrid.CellStyle経由でこれをやっていない)関連コラムcellstyles内XAMLを配置することによって、特定の列にのみバインドコントロールのようなXAMLからすべてを管理することができますこの方法をやってます。
とにかく、使用例がある
<Style.Triggers>
<DataTrigger Value="true" Binding="{Binding RelativeSource={RelativeSource Self}, Path=Tag.IsLocked}">
<Setter Property="FontStyle" Value="Italic"/>
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
はXAMLのレベルでは、それは単純で(特にI、セルオブジェクトのプロパティの多用を作るれる種々のツールヒントとポップアップ用)私見エレガントでもあります。しかし、私は確信してこれを行うには良い方法があると思います、ありますか?
うまくいけば、このすべての私は、私はできない、このプロジェクトのために、純4.0および動的オブジェクトを使用することができたときに消えます。