2010-10-21 34 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