C# [WPF] Datatrigger Value von ToggleButton Content

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hi,

ich versuche gerade in einem Style eines ToggleButton auf den Content des Togglebutton zuzugreifen.
Stehe gerade aber auf dem Schlauch. Zeit für Feierabend.... Also es geht um das Value hier müsste irgendwas wie {Parent.content oder self oder so stehen}....
Kann mir jemand von euch einen Tipp geben?
XML:
<ToggleButton.Style>
    <Style TargetType="ToggleButton"
           BasedOn="{StaticResource ContentButtonStyle}">
        <Setter Property="IsChecked"
                Value="False" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.CurrentHeader}"
                         Value="{}">
            <Setter Property="IsChecked"
                    Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ToggleButton.Style>

Danke!
 
Was ist denn das darüberliegende Problem? Rein aus der Kalten ohne es überhaupt getestet zu haben würde ich sowas probieren:
Code:
Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ToggleButton}, Path=Content}"

Ich glaub aber, dass das so nicht ganz klappt und ggf. ist der Ansatz auch nicht wirklich vorteilhaft. Daher wären etwas mehr Informationen durchaus sinnvoll.
 
Hey, ja klar waren etwas wenig infos. Daher jetzt das ganze Problem:
Die Anwendung ist mit MVVM umgesetzt.

Im ViewModel gibt es eine Liste von Strings und einer String-Variablen für das aktuell ausgewählte Element. Dies Strings der Liste aus dem VM möchte ich in einer ListView (abgeleitetes Control) darstellen. Jedes Element der Liste ist dabei ein Button. Der Content des Buttons entspricht einem Listenelement der Stringliste.
Klicke man auf einen Button wird ein Command abgefeuert und die String-Variable mit dem aktuellen Element geupdatet.
Anhand von dem "CurrentString" möchte ich dann die IsChecked-Eigenschaft des Button setzen.

Vereinfachte ListView-Struktur:
XML:
<ListView ItemsSource="{Binding ListeVonStrings}"
          ItemContainerStyle="{StaticResource ButtonTestStyle}"
          SelectedItem="{Binding CurrentHeader, Mode=OneWay}"/>

Der Style in dem das Template gesetzt wird:
XML:
<Style x:Key="ButtonTestStyle"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <ToggleButton Margin="0, 5, 5, 5"
                              Content="{Binding }"
                              Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.ChangeHeaderCommand}"
                              CommandParameter="{Binding}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ToggelButtonStyle der (noch) nicht funktioniert:
XML:
<ToggleButton.Style>
    <Style TargetType="ToggleButton"
           BasedOn="{StaticResource ContentButtonStyle}">
        <Setter Property="IsChecked"
                Value="False" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.CurrentHeader}"
                         Value="Hier Content des Buttons als Vergleich herziehen">
                <Setter Property="IsChecked"
                        Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ToggleButton.Style>
 
Ah, also quasi Klick, der ändert was und dann wird der Button gechecked, weil man ja jetzt auf dem "Stand" ist.
Leider klappt das so, wie du es dir denkst, nicht. DataTrigger.Value ist keine DependencyProperty und daher kannst du darauf kein Binding festlegen, eine dynamische Prüfung funktioniert daher nicht.

Ein gangbarer Weg, ohne zu viel im ViewModel rumzupfuschen, wäre ein MultiValueConverter analog zu diesem Beispiel hier, den Converter musst du dann natürlich an deine gewünschte Prüfung anpassen. Der vergleicht dann, ob {Binding} (dein aktueller String im Template) mit {Binding CurrentHeader} übereinstimmt. Tut es das gibt er True zurück, sonst False. Das packst du dann auf deine IsChecked-Property des ToggleButtons und dann sollte das passen denk ich.
 
Zurück
Oben