Стиль DataTrigger со ссылкой на Тип родительского элемента управления - PullRequest
8 голосов
/ 28 ноября 2010

В моем окне есть несколько элементов управления GroupBox, каждый из которых содержит элемент управления Grid.Этим сеткам я хочу присвоить стиль.Но только к тем гридам, которые находятся непосредственно в GroupBox, все остальные гриды не должны быть затронуты.

Я пробовал следующее, которое не работает, так как GetType () не является свойством.

Я нашел обходной путь, но это не очень красивое решение, так как мне нужно изменить GroupBoxes:

<Style TargetType="GroupBox">
    <Setter Property="Tag" Value="blub"/>
 </Style>
<Style TargetType="Grid">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Parent.Tag, RelativeSource={RelativeSource Mode=Self}}" Value="blub">
           <!-- <Setter Property="..." Value="..."/> -->
        </DataTrigger>
    </Style.Triggers>
</Style>

Очевидно, я мог бы установить стиль для каждой сетки вручную, но я пытаюсьчтобы избежать этого, так как их довольно много.Я надеюсь, что вы найдете способ заставить первый пример работать.

Ответы [ 3 ]

7 голосов
/ 29 ноября 2010
<DataTrigger Binding="{Binding Path=Parent.Tag, RelativeSource={RelativeSource Mode=Self}}" Value="blub">

Этот код не будет работать, потому что типом Mode на самом деле является BindingMode, который является перечислением, и ни один из его членов не является Self. Так что это назначение Mode = Self неверно в вашем коде. Чтобы узнать возможные значения режима, щелкните по этому .

Правильный способ написать это,

<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}, Path=Tag}" Value="blub">

И, конечно, чтобы это работало, вы должны сохранить тот стиль для GroupBox, который вы уже написали.

3 голосов
/ 01 декабря 2015

Это сработало для меня:

        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StatusBar}}, Path=DependencyObjectType.Name}" Value="StatusBar">
                <Setter Property="Margin" Value="0"/>
                <Setter Property="Padding" Value="0"/>
                <Setter Property="Background" Value="Chartreuse"/>
            </DataTrigger>
        </Style.Triggers>

Это позволяет вам устанавливать стиль на основе родительского типа, не прибегая к тегу, который действительно должен использоваться кодом, а не разметкой.

0 голосов
/ 13 ноября 2014

Используйте следующий код:

using DevExpress.Xpf.Core.Native;
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace BindingErrorHelper
{
    public class IsTypeFoundConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            FrameworkElement element = value as FrameworkElement;
            Type type = parameter as Type;
            if (element != null && type != null)
            {
                element = LayoutHelper.FindElement(element,type);
                if (element != null)
                    return true;
            }
            return false;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }

    public class LayoutHelper
    {
        public static FrameworkElement FindElement(FrameworkElement treeRoot, Type type)
        {
        FrameworkElement parentElement = VisualTreeHelper.GetParent(treeRoot) as FrameworkElement;
        while (parentElement != null)
        {
            if (parentElement.GetType() == type)
                return parentElement;
            else
                parentElement = VisualTreeHelper.GetParent(parentElement) as FrameworkElement;
        }
        return null;
        }
    }
}

Введите код XAML как:

<tt:IsTypeFoundConverter x:Key="isTypeFoundConverter"/>

<Style TargetType="Grid">
    <Style.Triggers>
        <DataTrigger Binding={Binding RelativeSource={RelativeSource Self}, Converter={StaticResource isTypeFoundConverter}, ConverterParameter={x:Type GroupBox}}" Value="true">
           <!-- <Setter Property="..." Value="..."/> -->
        </DataTrigger>
    </Style.Triggers>
</Style>
...