C# WPF-将多个值绑定到datagrind
更新:清理主题,并对其进行总结 嗨, 我填充了一个数据表,每个单元格都是这样的类C# WPF-将多个值绑定到datagrind,c#,wpf,data-binding,datagrid,datatemplate,C#,Wpf,Data Binding,Datagrid,Datatemplate,更新:清理主题,并对其进行总结 嗨, 我填充了一个数据表,每个单元格都是这样的类 class CValue{ public object Value; public Brush Quality; private int m_quality; public override String toString(){ return Value.toString(); } } 我的datagrid绑定在datable上,运行良好。
class CValue{
public object Value;
public Brush Quality;
private int m_quality;
public override String toString(){
return Value.toString();
}
}
我的datagrid绑定在datable上,运行良好。
但我的目标是根据质量值切换单元格的背景色
我打算使用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的值设置为“Blue”,那么所有单元格都是蓝色的,所以这很好,但我找不到方法将其绑定到我的属性。
[1]似乎返回行的第1列
如何动态设置单元格?
'因为我有一个动态的列数,但是有所有的CValue类型。您应该使用
DataTemplateSelector
类来执行此逻辑。
该场景描述如下:
- 创建数据模板集李>
- 根据MSDN文章中描述的选择适当的
的逻辑推导并实现李>DataTemplate
- 将自定义的
定义为指定DataTemplateSelector
属性的资源李>x:Key
- 将所需对象绑定到已定义的
资源DataTemplateSelector
<!--somewhere in resources-->
<QualityToBackgroundConverter x:Key="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();
}
}
您应该使用
DataTemplateSelector
类来执行此逻辑。
该场景描述如下:
- 创建数据模板集李>
- 根据MSDN文章中描述的选择适当的
的逻辑推导并实现李>DataTemplate
- 将自定义的
定义为指定DataTemplateSelector
属性的资源李>x:Key
- 将所需对象绑定到已定义的
资源DataTemplateSelector
<!--somewhere in resources-->
<QualityToBackgroundConverter x:Key="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();
}
}
保持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中,如下所示:
<Window.Resources>
<WpfApplication1:QualityToColorConverter x:Key="ColorConverter" />
</Window.Resources>
<Controls:DataGridCell Background="{Binding Quality, Converter={StaticResource ColorConverter}}">
</Controls:DataGridCell>
一个保持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中,如下所示:
<Window.Resources>
<WpfApplication1:QualityToColorConverter x:Key="ColorConverter" />
</Window.Resources>
<Controls:DataGridCell Background="{Binding Quality, Converter={StaticResource ColorConverter}}">
</Controls:DataGridCell>
好的。因此,对于整个示例,将数据绑定到模型的画笔,而不是使用转换器、样式等,用于以下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))
}
};
}
}
希望有帮助 好的。因此,对于整个示例,将数据绑定到模型的画笔,而不是使用转换器、样式等,用于以下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))
}
};
}
}
希望有帮助 仅仅为了改变背景而替换整个模板有些不必要,你不这样认为吗?使用样式或转换器应该更实用。我对DataTemplateSelector有点吃惊,这似乎有些过分,不是吗?仅仅为了改变背景而替换整个模板有点不必要,你不觉得吗?使用样式或转换器应该更实用。我对DataTemplateSelector有点吃惊,这似乎有些过分,不是吗?我认为在我的CValue类中创建一个“转换器”并直接绑定到颜色更容易,因为我使用位掩码来检查质量。。。我应该使用datatemplate吗?更新了一个转换器示例,如果您需要任何调整方面的帮助,请给出一个注释。作为附带说明,我注意到您的质量是一个“object”实例,这意味着ValueConversion属性需要是typeof(object)、typeof(SolidColorBrush)尽管我认为您应该键入质量,因为这样可以改进编译时错误检查。有什么想法吗?'object''DataRowView'(HashCode=57338399')上找不到'quality'属性。BindingExpression:路径=质量;DataItem='DataRowView'(HashCode=57338399);目标元素是“DataGridCell”(名称=“”);目标属性是'Background'(类型'Brush')System.Windows.Data错误:39:BindingExpression路径错误:“在'object''DataRowView'(HashCode=57338399)'上找不到'Value'属性。BindingExpression:Path=Value;DataItem='DataRowView'(HashCode=57338399);目标元素是“DataGridCell”(名称=“”);目标属性为“Content”(类型为“Object”),似乎您没有将CValue类绑定为datatemplate中的datacontext。如何将源代码绑定到DataGrid?我认为在CValue类中创建一个“转换器”并直接绑定到颜色更容易,因为我使用位掩码来检查质量。。。我应该使用datatemplate吗?更新了一个转换器示例,如果您需要任何调整方面的帮助,请给出一个注释。作为附带说明,我注意到您的质量是一个“object”实例,这意味着ValueConversion属性需要是typeof(object)、typeof(SolidColorBrush)尽管我认为您应该键入质量,因为这样可以改进编译时错误检查。有什么想法吗?'object''DataRowView'(HashCode=57338399')上找不到'quality'属性。BindingExpression:路径=质量;DataItem='DataRowView'(HashCode=57338399);目标元素是“DataGridCell”(名称=“”);目标属性是'Background'(类型'Brush')System.W