0

WPFと同様- XAML バインディング式をコード ビハインドに変換するのに役立ちます

バインディングを使用して、DataGridTextColumn 内の特定の要素の色を変更しようとしています。個別のタブに任意の数の DataGrid が必要なため、分離コードで繰り返し作成しています。列を作成するための私のコードは次のとおりです。

// create a value column
column = new DataGridTextColumn();
column.Binding = new Binding("Value");
BindingOperations.SetBinding(column, DataGridTextColumn.ForegroundProperty, new Binding("TextColor"));
listGrid.Columns.Add(column);

Value バインディングは正常に機能しますが、TextColor プロパティの getter は呼び出されません。

グリッドの ItemsSource プロパティは、VariableWatcher オブジェクトのリストに設定されており、そのプロパティの一部を次に示します。

public bool Value
{
    get { return _variable.Value; }
}
// used to set DataGridTextColumn.Foreground
public Brush TextColor
{
    get
    {
        Color brushColor;
         if (_valueChanged)
            brushColor = Color.FromRgb(255, 0, 0);
        else
            brushColor = Color.FromRgb(0, 0, 0);
         return new SolidColorBrush(brushColor);
    }
}

VariableWatcher は、次のように INotifyPropertyChanged を実装します。

public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

VariableWatcher のメソッドの 1 つに、次の行があります。

_valueChanged = true;
NotifyPropertyChanged("Value");
NotifyPropertyChanged("TextColor");

「Value」行をまたぐと、Value getter のブレークポイントがアクティブになり、Value テキストがディスプレイで更新されます。ただし、「TextColor」行をステップオーバーしても、TextColor ゲッターのブレークポイントはアクティブにならず、テキストの色は変更されません。ここで何が起こっているのか分かりますか?

編集:ダマスカスのおかげで、これが答えです。(これを彼の回答のコメントに入れましたが、コードが適切にフォーマットされませんでした。)これをXAMLファイルに追加しました:

<Window.Resources>
    <Style x:Key="BoundColorStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="{Binding TextColor}" />
    </Style>
</Window.Resources>

C# コードでは、BindingOperations 行を次のように置き換えました。

column.ElementStyle = this.FindResource("BoundColorStyle") as Style;
4

3 に答える 3

1

これに対する回避策:

次のように、リソースにスタイルを作成します。

<Style x:Key="MyStyle" TargetType="{x:Type TextBlock}">
  <Setter Property="Foreground" Value="{Binding TextColor}" />
</Style>

ElementStyleそして、あなたの のプロパティでこのスタイルを設定DataGridColumnし、コードで次のようにする必要があります。

column = new DataGridTextColumn();
column.Style = this.FindResource("MyStyle") as Style;

ElementStyle列のコンテンツで直接機能する理由(つまりTextBlock、値の表示)

于 2012-10-25T18:30:50.780 に答える
0

damascusの回避策を使用しますが、コード ビハインドのみを使用します。

var myStyle = new Style
{
   TargetType = typeof(TextBlock)
};
textColumnStyleExt.Setters.Add(new Setter(TextBlock.ForegroundProperty, new Binding("TextColor"));
column = new DataGridTextColumn();
column.Binding = new Binding("Value");
column.ElementStyle = myStyle;
于 2020-10-13T13:27:11.303 に答える