Как я могу условно связать стиль на основе результата Предиката для исходного объекта? - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть сетка данных WPF, и я заполняю ее данными из DataView.Я хочу условно применить стиль к каждой ячейке DataGrid на основе результата функции Predicate, примененной к исходному объекту.

Я все еще не получаю привязку данных WPF, поэтому яв недоумении относительно того, как идти об этом, или с чего начать.Кто-нибудь может дать указания или решения, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 23 июля 2013

Вы можете выбрать шаблон данных для ячейки на основе произвольного свойства в модели представления, используя DataGridTemplateColumn с CellTemplateSelector.

в ресурсах:

    <DataTemplate x:Key="SomeCellStyle" DataType="{x:Type local:MyItemViewModel}">
        <TextBlock Text="{Binding Whatever}" />
    </DataTemplate>
    <DataTemplate x:Key="OtherCellStyle" DataType="{x:Type local:MyItemViewModel}">
        <TextBlock Text="{Binding Whatever}" />
    </DataTemplate>

в DataGrid:

        <DataGridTemplateColumn Header="Name">
            <DataGridTemplateColumn.CellTemplateSelector>
                <local:MyItemDataTemplateSelector TypeProperty="Type"
                    DefaultTemplate="{StaticResource SomeCellStyle}"
                    SomeTemplate="{StaticResource SomeCellStyle}"
                    OtherTemplate="{StaticResource OtherCellStyle}" />
            </DataGridTemplateColumn.CellTemplateSelector>
        </DataGridTemplateColumn>

код:

public class MyItemViewModel
{
    public MyEnum Type { get; set; }
}

public class MyItemDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate DefaultTemplate { get; set; }
    public DataTemplate SomeTemplate { get; set; }
    public DataTemplate OtherTemplate { get; set; }
    public string TypeProperty { get; set; }

    public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
    {
        if (item != null)
        {
            var type = item.GetType();
            var property = type.GetProperty(TypeProperty);
            if (property != null)
            {
                var value = property.GetValue(item, null);
                if (value != null)
                {
                    switch ((MyEnum) value)
                    {
                        case MyEnum.SomeValue:  return SomeTemplate;
                        case MyEnum.OtherValue: return OtherTemplate;
                    }
                }
            }
        }
        return DefaultTemplate;
    }
}
0 голосов
/ 22 декабря 2010

Не существует стандартного (как в «только XAML») способа сделать такое связывание. Сама привязка позволяет указать соотношение 1: 1 между визуальным элементом и значением свойства (экземпляра или статического) в источнике. Атрибуты не выражаются автоматически через свойства, поэтому вы не можете связываться с ними.

Однако вы можете написать собственный конвертер, который берет исходный код, проверяет тип на наличие атрибута и возвращает имя стиля, которое вам нужно. Если вы хотите сделать его причудливым, атрибут может иметь фактическое имя стиля, хотя это будет означать, что ваша бизнес-модель будет полужестко привязана к презентации, поскольку теперь она будет иметь определенные знания о логике представления.

Пример пользовательского преобразователя можно увидеть в Обзоре привязки данных на MSDN (http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion).. В вашем конкретном случае вам придется создать привязку к самому исходному объекту (без указания пути), чтобы вы могли получить фактическую instance как значение в методе Convert. Это позволит вам затем получить Type и проверить атрибут, а затем создать объект Style, который будет возвращен для привязки.

Обновление : если вы хотите стилизовать определенную ячейку, вам нужно отключить AutoGenerateColumns и указать DataGridTempletaColumn для конкретной ячейки. Затем вы указываете свой собственный шаблон данных, привязанный к объекту, и используете селектор стилей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...