代码之家  ›  专栏  ›  技术社区  ›  ykatchou

WPF-将多个值绑定到datagrind

  •  0
  • ykatchou  · 技术社区  · 14 年前

    :清理主题,并进行总结。

    我有一个数据表,每个单元格都是这样的类

    class CValue{
         public object Value;
         public Brush Quality;
         private int m_quality;
    
         public override String toString(){
               return Value.toString();
         }
    }
    

    但我的目标是根据质量值来切换单元格的背景色。

    我打算使用数据模板,但根本不知道它是如何工作的。。。

    <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值设置为“Blue”,那么所有的单元格都是blued,所以没关系,但是我找不到方法将其绑定到我的属性。 [1]似乎返回行的第1列。。。

    因为我有一个动态的列数,但是有所有的CValue类型。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Almund    14 年前

    好 啊。所以对于一个完整的示例,数据绑定到模型的画笔,而不是使用转换器、样式等,用于以下cs代码:

    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(注意 TargetType 关于风格和 AutoGenerateColumns="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>
    

    希望有帮助!

        2
  •  1
  •   Almund    14 年前

    保持颜色在XAML中可见的一个好方法是使用绑定到质量的样式。我们将这种样式放在模板上方的some 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>
    

    更新:

    要能够使用这样的转换器对值或其他内容进行数据绑定:

    [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!");
        }
    }
    

    <Window.Resources>
        <WpfApplication1:QualityToColorConverter x:Key="ColorConverter" />
    </Window.Resources>
    
    <Controls:DataGridCell Background="{Binding Quality, Converter={StaticResource ColorConverter}}">
    </Controls:DataGridCell>
    
        3
  •  1
  •   Eugene Cheverda    14 年前

    你应该用 DataTemplateSelector 类来执行此逻辑。

    • 创建数据模板集;
    • 源自 DataTemplateSelector Class 并实现选择合适的逻辑 DataTemplate
    • 定义您的自定义 数据模板选择器 作为指定 x:Key 属性;
    • 将所需对象绑定到定义的 数据模板选择器 资源。

    更新

    因此,对于此任务,应创建转换器,将其定义为资源并将其添加到绑定中:

    <!--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();
        }
    }