Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-将多个值绑定到datagrind_C#_Wpf_Data Binding_Datagrid_Datatemplate - Fatal编程技术网

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