WPF - привязка нескольких значений к селектору данных - PullRequest
0 голосов
/ 21 октября 2010

ОБНОВЛЕНО : Очистить объект и обобщить его.

Привет, Я заполнил таблицу, где каждая ячейка является классом, подобным этому

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>

На самом деле, если в качестве значения установщика фона задано «Синий», все ячейки синего цвета, так что все в порядке, но я не могу найти способ привязать его к своему свойству. [1], кажется, возвращает столбец 1 строки ...

Как установить ячейку динамически? Потому что у меня есть динамическое число столбцов, но там все типа CValue.

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Один хороший способ сделать так, чтобы цвета были видимы в XAML, - это использовать стиль с привязкой к качеству. Мы поместили этот стиль в некоторый ресурсный словарь над шаблоном, как в моем случае в 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!");
    }
}

Свяжите это в XAML как следующий:

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

<Controls:DataGridCell Background="{Binding Quality, Converter={StaticResource ColorConverter}}">
</Controls:DataGridCell>
1 голос
/ 22 октября 2010

Хорошо.Так что для всего примера привязка данных к Brush модели вместо использования конвертеров, стилей и т. Д. Для следующего 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 для стиля строки (обратите внимание на 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>

Надеюсь, это поможет!

1 голос
/ 21 октября 2010

Вы должны использовать DataTemplateSelector класс для выполнения этой логики. Сценарий описан ниже:

  • Создать набор DataTemplates;
  • Получите из DataTemplateSelector Class и реализуйте там логику выбора подходящего DataTemplate, как описано в статье MSDN;
  • Определите свой пользовательский 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();
    }
}
...