2012-10-25 92 views
0

類似WPF - help converting XAML binding expression to codebehind綁定從C#代碼隱藏

我試圖DataGridTextColumn顏色使用綁定改變一個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); 

值綁定工作正常,但文字顏色屬性的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的方法之一,我有以下幾行:

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

單擊「Value」行將激活Value getter中的斷點,並在顯示中更新Value文本。但是,跨越「TextColor」行不會激活TextColor getter中的斷點,並且文本顏色不會更改。任何想法這裏發生了什麼?

編輯:這是答案,感謝大馬士革。 (我早就把這個在他的回答評論,但它不會正確地格式化我的代碼)。我已將此添加到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; 

回答

1

解決方法是:

在你的資源創建一個樣式,看起來就像是:

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

並將此風格在你DataGridColumnElementStyle財產,應該是類似的東西在你的代碼:

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

它的原因在於ElementStyle列的內容直接有效(即。 TextBlock顯示值)

+0

謝謝!我發佈了我在上面的問題中添加的確切代碼。 – hypehuman

0

它可以通過後面的代碼來實現,也可以不帶樣式。 重要的一點是爲目標屬性設置的新綁定表達式顯式設置綁定源(請參見下面的代碼)。

在這個例子中,DataGrid生成動態列,並且以ColloectionViewSource的對象(即cycleDataview)爲界,而cycleDataview的源是ObservableCollection的一個對象,它是cycleRecord。

// Create view source 

this.cycleDataview = new CollectionViewSource(); 
this.cycleDataview.Source = this.cycleRecords; 

// Set Item Source to data grid 
this.DataGridCycleData.ItemsSource = this.cycleDataview.View; 

// Generate Columns for datagrid 
var columns = this.cycleRecords.First().CyclePartCols.Select((x, i) => new {PreDescriptor = x.PreDescriptor, Index = i }).ToArray(); 

foreach (var column in columns) 
{ 

    Binding binding = new Binding(string.Format("CyclePartCols[{0}].PartValue", column.Index)); 

    Binding bindingColor = new Binding(string.Format("CyclePartCols[{0}].TextColor", column.Index)); 
    **bindingColor.Source = this.cycleRecords;** // Binding source is required to set 

    DataGridTextColumn dgc = new DataGridTextColumn(); 


    txtblckCol.Text = column.PreDescriptor; 
    dgc.Header = txtblckCol; 
    dgc.Binding = binding; 
    this.DataGridCycleData.Columns.Add(dgc); 
    BindingOperations.SetBinding(dgc, DataGridTextColumn.ForegroundProperty, bindingColor);     

}