2010-10-21 33 views
0

已更新:清理主題,並對其進行總結。WPF - 將多個值綁定到datagrind

嗨, 我有一個確定年代填充,其中每個細胞是一類這樣的

class CValue{ 
    public object Value; 
    public Brush Quality; 
    private int m_quality; 

    public override String toString(){ 
      return Value.toString(); 
    } 
} 

我的DataGrid是在確定時代結合,它的運作良好。 但我的目標是根據質量值切換單元的背景顏色。

我打算TU使用DataTemplate中,但不知道它是如何工作在所有...

<dg:DataGrid Name="DataGridResult" IsReadOnly="True" AutoGenerateColumns="False" 
    BorderThickness="1" BorderBrush="{DynamicResource clBLACK}" 
    CanUserReorderColumns="False" 
    ItemsSource="{Binding Path=Result}"> 
      <dg:DataGrid.Resources> 
      <Style TargetType="{x:Type dg:DataGridCell}"> 
       <Style.Setters> 
        <Setter Property="Background" Value="{Binding [1].Quality}"/> 
       </Style.Setters> 
      </Style> 
      </dg:DataGrid.Resources>   
      <dg:DataGrid.ItemTemplate> 
      <DataTemplate> 
       <dg:DataGridCell> 
        </dg:DataGridCell> 
      </DataTemplate> 
      </dg:DataGrid.ItemTemplate> 
</dg:DataGrid> 

其實,如果背景的setter的值設置爲「藍色」,所有單元都是藍鋼,所以沒關係,但我找不到將其綁定到我的房產的方法。 [1]似乎要返回該行的第1列...

如何設置爲單元格動態? '因爲我有一個動態數量的列,但有所有的CValue類型。

+0

你真的不想擁有質量刷嗎?當然你可以有,但我認爲它的整潔使用轉換器或DataTrigger值綁定。 – Almund 2010-10-21 13:24:39

+0

Yeap,但實際上我需要將一些值和顏色置入配置中,所以在代碼中。我正在尋找最簡單的方法:) – ykatchou 2010-10-21 13:50:08

+0

好吧,在這種情況下,你不需要任何轉換器,直接綁定到質量背景= {綁定質量}。你想用.cs的應用程序的一個簡短的例子,說明我認爲你想要做什麼? – Almund 2010-10-22 08:12:10

回答

1

好的。因此,對於整個例子數據綁定模型的刷,而不是使用轉換器,款式等。以下CS -code:

class CValue 
{ 
    public string Value { get; set; } // Notice we use properties for binding and not fields 
    public Brush Quality { get; set; } // Notice we use properties for binding and not fields 
    private int m_quality; 

    public override String ToString() 
    { 
     return Value.ToString(); 
    } 
} 

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     // Databind the list 
     myGrid.ItemsSource = new List<CValue> 
          { 
           new CValue 
            { 
             Value = "First", 
             Quality = new SolidColorBrush(Color.FromArgb(255, 0, 255, 255))}, 
           new CValue 
            { 
             Value = "Second", 
             Quality = new SolidColorBrush(Color.FromArgb(255, 255, 0, 255)) 
            }, 
           new CValue 
            { 
             Value = "Third", 
             Quality = new SolidColorBrush(Color.FromArgb(0, 255, 255, 255)) 
            } 
          }; 
    } 
} 

你會使用XAML的rowstyle(注意在風格TargetTypeAutoGenerateColumns="false")綁定行顏色和值:

<Controls:DataGrid x:Name="myGrid" AutoGenerateColumns="False"> 

    <Controls:DataGrid.RowStyle> 
     <Style TargetType="{x:Type Controls:DataGridRow}"> 
      <Setter Property="Background" Value="{Binding Quality}" /> 
     </Style> 
    </Controls:DataGrid.RowStyle> 

    <Controls:DataGrid.Columns> 
     <Controls:DataGridTemplateColumn Header="Value"> 
      <Controls:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Label Content="{Binding Value}" /> 
       </DataTemplate> 
      </Controls:DataGridTemplateColumn.CellTemplate> 
     </Controls:DataGridTemplateColumn> 
    </Controls:DataGrid.Columns> 

</Controls:DataGrid> 

希望它有幫助!

+0

嗨,非常感謝,我不是很遠我想,我有這個錯誤:System.Windows.Data錯誤:39:BindingExpression路徑錯誤:'質量'屬性找不到對象''''DataRowView' (的HashCode = 9847817)」。BindingExpression:路徑=質量; DataItem ='DataRowView'(HashCode = 9847817);目標元素是'DataGridRow'(Name ='');目標屬性是'Background'(類型'Brush'),也許這是因爲我綁定了一個datable,其中每個Cell都是一個CValue – ykatchou 2010-10-22 09:16:16

+0

您仍然將錯誤的東西綁定到ItemSource,您不想綁定數據網格但一個列表。你在哪裏設置DataContext? – Almund 2010-10-22 10:40:04

+0

所以我可以嘗試像ItemsSource = {Binding Result.Rows}? – ykatchou 2010-10-25 07:37:19

1

您應該使用DataTemplateSelector類來執行此邏輯。 該場景描述如下:

  • 創建一組DataTemplates;
  • DataTemplateSelector Class導出並實現邏輯選擇合適的DataTemplate如MSDN Article中所述;
  • 將您的自定義DataTemplateSelector定義爲指定x:Key屬性的資源;
  • 將需要綁定的對象綁定到定義的DataTemplateSelector資源。

UPDATE

上的做法的效果最好,當您需要完全重新設計的細胞在評論中提及的傢伙。

因此,對於這個任務,你應該創建你的轉換器,把它定義爲一種資源,並把它添加到你的綁定:

<!--somewhere in resources--> 
<QualityToBackgroundConverter x:Key="qualityToBackgroundConverter "/> 

然後結合看起來像:

Background="{Binding Quality, Converter={StaticResource qualityToBackgroundConverter }}" 

並最終轉換器:

[ValueConversion(typeof(Quality), typeof(Brush))] 
public class QualityToBackgroundConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null) 
     { 
      Quality quality = (Quality)value;   
      switch (quality) 
      { 
       case 0: return Brushes.Red; 
       case 1: return Brushes.Yellow; 
       case 2: return Brushes.Green; 
       default: return Brushes.Transparent; 
      } 
     } 
     return Brushes.Transparent; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw NotImplementedException(); 
    } 
} 
+0

只是爲了改變背景而替換整個模板,你覺得有點不太合適嗎?使用風格或轉換器應該更實用。 – Almund 2010-10-21 09:04:27

+0

我有點擔心DataTemplateSelector它似乎矯枉過正,不是嗎? – ykatchou 2010-10-21 09:11:36

+0

查看轉換器更新。 – 2010-10-21 09:27:58

1

這樣做可以讓着色在XAML中可見的一個好方法是使用與質量綁定的樣式。我們把這個樣式放在模板上面的一些resourcedictionary中,就像我在DataGrid.Resources中的情況一樣。

<Controls:DataGrid> 
    <Controls:DataGrid.Resources> 
     <Style TargetType="{x:Type Controls:DataGridCell}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Quality}" Value="0"> 
        <Setter Property="Background" Value="Red" /> 
       </DataTrigger> 

       <DataTrigger Binding="{Binding Quality}" Value="0"> 
        <Setter Property="Background" Value="Blue" /> 
       </DataTrigger> 

      </Style.Triggers> 
     </Style> 
    </Controls:DataGrid.Resources> 
    <Controls:DataGrid.ItemTemplate> 
     <DataTemplate> 
      <Controls:DataGridCell> 
      </Controls:DataGridCell> 
     </DataTemplate> 
    </Controls:DataGrid.ItemTemplate> 
</Controls:DataGrid> 

更新:

爲了能夠數據綁定的值或任何使用這樣的轉換器:在XAML

[ValueConversion(typeof(int), typeof(SolidColorBrush))] 
public class QualityToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Cast value 
     int intValue = (int) value; 

     if (intValue == 1) 
      return new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)); 

     return new SolidColorBrush(Color.FromArgb(255, 0, 0, 255)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException("TwoWay binding not supported!"); 
    } 
} 

綁定它像follwing:

<Window.Resources> 
    <WpfApplication1:QualityToColorConverter x:Key="ColorConverter" /> 
</Window.Resources> 

<Controls:DataGridCell Background="{Binding Quality, Converter={StaticResource ColorConverter}}"> 
</Controls:DataGridCell> 
+0

我認爲在我的CValue類中製作一個「轉換器」更容易,並直接綁定到顏色,因爲我使用位掩碼來檢查質量......我應該使用數據模板嗎? – ykatchou 2010-10-21 09:07:26

+0

更新了Converter示例,如果您需要任何調整幫助,請發表評論。 – Almund 2010-10-21 09:20:49

+0

作爲一個側面提示,我注意到你的質量是一個'對象'實例,這意味着ValueConversion屬性需要是typeof(object),typeof(SolidColorBrush),儘管我認爲你應該輸入質量,因爲這會改進你的編譯實時錯誤檢查。 – Almund 2010-10-21 09:40:32