Laden...

Prioritäten von Styles und "explizit" angegebenen Properties?

Erstellt von sth_Weird vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.496 Views
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 7 Jahren
Prioritäten von Styles und "explizit" angegebenen Properties?

Hallo,
ich habe ein Problem mit einem View.
Ich habe in den Resources ein Style für TextBoxen angelegt. Dieses Style setzt, abhängig von einem Wert im ViewModel des Views, alle TextBoxen auf ReadOnly oder Schreibbar. Zur Veranschaulichung nehmen wir mal an das ViewModel hieße "MainViewModel" und das Property "WriteProtection"
Der View enthält auch ein ItemsControl. Das ItemsControl zeigt eine Liste mit ViewModels "ElementViewModel" an (die Liste der ElementViewModels ist im MainViewModel als Property enthalten).
Das ItemTemplate enthält nun wiederum auch eine TextBox. Diese TextBox will ich immer ReadOnly haben. Daher habe ich explizit für diese TextBox im XAML das Property IsReadOnly=True definiert.
Nun meckert VS für die TextBox im ItemsControl immer, "ElementViewModel" hätte kein "WriteProtection" Propery, welches vom Property "IsReadOnly" der TextBox verlangt würde.
(nur zur Klarstellung: Dass mein angezeigtes Objekt im ItemsControl einen anderen DataContext (= aktuell angezeigtes ElementViewModel) hat und damit das WriteProtection des MainViewModels nicht kennt ist mir klar, also da liegt nicht das Verständnisproblem...)
Ich verstehe die Fehlermeldung nicht, da ich bei IsReadOnly explizit True angegeben habe. Dieser Wert, der explizit für das Control angegeben ist, müsste doch eigentlich den Wert aus dem Style, der in den Resourcen angegeben ist, überschreiben, oder???
Mein Kenntnisstand war, dass explizit angegebene Werte höherprior sind als die Werte die in den Resourcen des eigenen View/UserControl stehen, und diese wiederum höherprior als die Resourcen, die in anderen, verwiesenen Resourcen stehen.

Wo ist mein Denkfehler, warum wird fürs ItemsControl-Template scheinbar das "IsReadOnly" aus dem Style verwendet und nicht mein explizit angegebener Wert?

In den Resources des Views (relevanter Ausschnitt):


<Style TargetType="TextBox">
                <Setter Property="IsReadOnly" Value="{Binding Path=WriteProtection, ... /Setter>

ItemsControl im View (nur die relevanten Ausschnitte):


 <ItemsControl x:Name="ICtrlElements"... ItemsSource="{Binding Path=MyElements}" >
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Margin="0,0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="120" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <TextBox Grid.Column="1" Text="{Binding ExampleProperty, Mode=OneTime}" IsReadOnly="True" TextWrapping="Wrap" />

Der Fehler:> Fehlermeldung:

System.Windows.Data Error: 40 : BindingExpression path error: 'WriteProtection' property not found on 'object' ''ElementViewModel' (HashCode=49829907)'. BindingExpression:Path=WriteProtection; DataItem='ElementViewModel' (HashCode=49829907); target element is 'TextBox' (Name=''); target property is 'IsReadOnly' (type 'Boolean')

gruß & danke
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

1.040 Beiträge seit 2007
vor 7 Jahren

Ist die TextBox am Ende dann trotzdem gesperrt?

Bin mir nicht ganz sicher, allerdings sollte erst der Style draufgepackt werden und dann die expliziten Einstellungen greifen. Anders wäre es, wenn du für die entsprechenden TextBoxen einen Style anlegst der von deinem Hauptstyle erbt und in diesem ReadOnly auf true/false setzt.

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 7 Jahren

Ich habe noch etwas rumprobiert und folgendes herausgefunden:

  • ich habe ein benanntes Style erstellt für meine Textbox, die ReadOnly sein soll. Das einzige, was dieses Style macht ist, dass es ReadOnly immer auf True setzt.
  • wenn ich der besagten TextBox im ItemTemplate dieses Style zuweise, dann funktioniert es, die Meldungen mit dem fehlenden Property sind weg und die TextBox ist immer ReadOnly, wie gewünscht 😃
    Weshalb es nicht funktioniert, wenn man nur das ReadOnly überschreibt, wüsste ich trotzdem gerne noch...

gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

1.040 Beiträge seit 2007
vor 7 Jahren

Weshalb es nicht funktioniert, wenn man nur das ReadOnly überschreibt, wüsste ich trotzdem gerne noch...

Weil das ReadOnly nicht überschrieben wird.
Es wird erst der Style angewendet - weswegen er eben das Binding auflösen möchte - und dann werden die Properties gesetzt.

Wenn du dir ein rotes Auto kaufst (Style), um es danach blau anzumalen (gesetzte Properties), dann ist es zuerst trotzdem rot.
Anders ist es, wenn du dir gleich ein blaues Auto kaufst (überschriebener Style!).

Du bist auf meine Frage leider nicht eingegangen

Ist die TextBox am Ende dann trotzdem gesperrt?

denn mMn sollte die TextBox am Ende trotzdem gesperrt sein - trotz der Warnung.

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 7 Jahren

Das hatte ich garnicht mehr ausprobiert, da ich gleich die Meldung gesehen hatte. Habe es nochmal zurückgebaut und ja, die TextBox war trotzdem gesperrt...

Ich hätte erwartet, dass hier optimiert wird...also erst mal "im Background" alles ausgewertet wird, und dann für das jeweilige Property nur das angewandt wird, "was am Ende da steht". Aber deine Erklärung mit dem roten/blauen Auto leuchtet schon ein...

Gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+