Laden...

Visibility erst nach einem Converter setzen

Erstellt von p!lle vor 5 Jahren Letzter Beitrag vor 4 Jahren 1.638 Views
p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 5 Jahren
Visibility erst nach einem Converter setzen

Moin,

stehe derzeit vor einem (wahrscheinlich) kleinen Problem, zu dem mir partout keine Lösung einfällt (bzw. keine Schlagwörter für Google einfallen). 🤔

Normalerweise kann man über ein Bindung bzw. ein Markup (mit Konstruktorparameter) ja total einfach eine Visibility setzen:

<TabItem Visibility="{Binding MeineTolleProperty}"
<TabItem Visibility="{MeineTolleMarkupExtension MeinTollerKonstrParam}"

Nun benötige ich aber für das Binding/das Markup einen Converter, den ich in den Ressourcen des TabItem definiere, dadurch kann ich erst später im XAML die Visibility setzen:

<TabItem>
    <TabItem.Visibility>
        ???
    </TabItem.Visibility>
</TabItem>

Für ein Binding lässt sich die Stelle mit den "?" leicht füllen, wie aber macht man es bei einem Markup mit Konstruktorparametern? 🤔

2.078 Beiträge seit 2012
vor 5 Jahren

Verstehe ich dich richtig, dass Du das Ergebnis von deiner MarkupExtension durch einen Converter jagen willst?

Also analog zu:

{Binding MeineTolleProperty, Converter={MeinTollerConverter}}

Soll es heißen:

{MeineTolleMarkupExtension MeinTollerKonstrParam, Converter={MeinTollerConverter}}

Mein erster Versuch wäre sowas:

{Binding Source={MeineTolleMarkupExtension MeinTollerKonstrParam}, Converter={MeinTollerConverter}}

Beachte aber:
Du bekommst in keiner Weise (egal ob direkt mit Extension oder als Binding-Source) mit, wenn die MarkupExtension einen anderen Wert liefern wird, da die kein Handling dafür hat.

So ganz ist mir aber auch nicht klar, was das überhaupt bezwecken soll.

p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 5 Jahren
<TabItem Visibility={MeineTolleMarkupExtension MeinTollerKonstrParam, Converter={MeinTollerConverter}}  

Das geht ja ohne Problem, habe das "Visibility" mal ergänzt.
Nur weiß ich eben nicht, wie ich es angebe, wenn ich es eben über

<TabItem>
    <TabItem.Visibility>
        ???
    </TabItem.Visibility>
</TabItem>

setzen muss.

Die MarkupExtension liefert ein bool zurück, entsprechend muss für die Visibility ein Converter dazwischen. 😉

2.078 Beiträge seit 2012
vor 5 Jahren

Prinzipiell kannst Du jedes Binding auch ohne MarkupExtension schreiben:

<Binding Source="{MeineTolleMarkupExtension MeinTollerKonstrParam}">
    <Binding.Converter>
        <MeinTollerConverter />
    </Binding.Converter>
</Binding>

Die IntelliSense bietet dir das "Binding" zwar nicht an, geht aber trotzdem.

5.299 Beiträge seit 2008
vor 5 Jahren

Ich hab mal ein Tutorial verzapft, wo ich derlei Feinheiten der Xaml-Syntax bisserl auf Grund gehe.
Dazu hab ich einfach ein Stück Xaml (fast) ohne jede Syntax-Vereinfachuing formuliert, und anschließend die verschiedenen Vereinfachungen angewendet (Property-Attribute-Syntax, DefaultProperties, Markup-Extensions, TypConverter) - bis schließlich leidlich "normales" Xaml bei rauskommt.

Der frühe Apfel fängt den Wurm.

p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 4 Jahren

Moin,

entschuldigt bitte die verspätete Antwort, war die letzten Wochen kaum online.

Im Endeffekt ist es ja dann doch ziemlich einfach, man ist nur irgendwie immer zu verwöhnt von den ganzen Kurzschreibweisen. 👅

Also entweder so

<TabItem>
    <TabItem.Visibility>
        <Binding Path="MeineTolleProperty" Converter="{StaticResource meinTollerConverter}" />
    </TabItem.Visibility>
</TabItem>

oder so

<TabItem>
    <TabItem.Visibility>
        <Binding Source="{MeineTolleMarkupExtension MeinTollerKonstrParam}" Converter="{StaticResource meinTollerConverter}" />
    </TabItem.Visibility>
</TabItem>

Die Ausgangsfrage hat sich mittlerweile aber schon wieder erledigt bzw. die Anforderung hat sich geändert, sodass ich das Ganze aktuell doch nicht brauche.
Nichtsdestotrotz wieder etwas dazugelernt. 👍