Zmiana Controltemplate w zależności od właściwości w DataContext

0

Witajcie. Mam klasę ModuleElement która posiada właściwości **IsSelected **oraz IsEnabled Stworzyłem 3 buttony, i umieściłem instancje tych klas jako **DataContext **tych buttonów..

<Button x:Name="hElementCreateAccount" Margin="0,0,7,0">
                        <Button.Style>
                            <Style TargetType="Button">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsSelected}" Value="false">
                                        <Setter Property="Template" Value="{StaticResource ButtonStandard}"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding IsSelected}" Value="true">
                                        <Setter Property="Template" Value="{StaticResource ButtonSelected}"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding IsEnabled}" Value="false">
                                        <Setter Property="Template" Value="{StaticResource ButtonDeactivated}"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                        <Button.DataContext>
                            <Type:ModuleElement x:Name="hElementCreateAccountData" ModuleNameEnum="CreateAccount" RequiredPrivileges="Undefined" ActiveWhenLogged="False" ActiveWhenNotLogged="True" />
                        </Button.DataContext>
                    </Button>

Gdy w tym miejscu używam **triggera **do określenia **template **wszystko działa cacy. Niestety mam 3 buttony a w kursach kazali mi jak najczęściej robić szablony, jeżeli kilka kontrolek korzysta z tych samych styli. Zrobiłem więc taki szablon w oddzielnym pliku ResourceDisctionary oraz potrzebne konwertery:

<Style TargetType="Button" x:Key="hButtonStyle">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=DataContext, Converter={StaticResource GetIsSelectedFromDataContext}}" Value="false">
                <Setter Property="Template" Value="{StaticResource ButtonStandard}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=DataContext, Converter={StaticResource GetIsSelectedFromDataContext}}" Value="true">
                <Setter Property="Template" Value="{StaticResource ButtonSelected}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}, Path=DataContext, Converter={StaticResource GetIsEnabledFromDataContext}}" Value="true">
                <Setter Property="Template" Value="{StaticResource ButtonDeactivated}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
// DataContext To IsSelected Converter
    class DataContextToIsSelectedConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return null;
            bool Val = (value as ModuleElement).IsSelected;
            return (Val == true) ? "true" : "false";
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }

    // DataContext To IsEnabled Converter
    class DataContextToIsEnabledConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return null;
            bool Val = (value as ModuleElement).IsEnabled;
            return (Val == true) ? "true" : "false";
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }

W kontrolkach button dodałem:

Style="{StaticResource hButtonStyle}

Niestety to cholerstwo za cholerę nie chce mi działać :( Kontrolki mi znikają jakby template przestał istnieć. Możecie pomóc zlokalizować problem?

0

A podpiąłeś styl z osobnego pliku w App.xaml ?

0
mariano901229 napisał(a):

A podpiąłeś styl z osobnego pliku w App.xaml ?

Tak. Jest problem z konwerterem na 100%. Jeżeli zrobię to na tysiącach DataTriggerach to działa jak należy

1 użytkowników online, w tym zalogowanych: 0, gości: 1