Frage

Ist es möglich, Wert-Wandler, ohne Sie definieren zu müssen vorher als Ressourcen?

Jetzt habe ich

<Window.Resources>
    <local:TrivialFormatter x:Key="trivialFormatter" />
</Window.Resources>

und

<Button Width="{Binding Width, 
               ElementName=textBox1, 
               UpdateSourceTrigger=PropertyChanged, 
               Converter={StaticResource trivialFormatter}}">

Wäre es nicht möglich, dass anstatt zu erklären, dass die trivialFormatter-Ressource-Fenster.Ressourcen, konnte ich Sie direkt beziehen es aus der Button-Breite verbindlich?So etwas wie

Converter = {local:TrivialFormatter}

Vielen Dank

War es hilfreich?

Lösung

Im Falle der singleton-Typ IValueConverters (Z. B.Sie brauchen nicht, dass jeder Staat aus der aktuellen verbindliche Instanz) kann ich die Verwendung von statischen Wandlern, d.h.:

Converter={x:Static SomeNamespace:SomeConverter.Instance}

Es gibt auch einen großen Beitrag von Dr.WPF mithilfe einer markup-Erweiterung zu machen es Reiniger inline hier.

Andere Tipps

Technisch Ich glaube, dies zu tun, aber die XAML ist so schrecklich, dass es die „viele trivialen Ressourcen“ Ansatz aussieht wie eine Oase der Einfachheit und Klarheit im Vergleich zu machen:

<Button Height="50">
  <Button.Width>
    <Binding Path="Width" ElementName="textBox1" UpdateSourceTrigger="PropertyChanged">
      <Binding.Converter>
        <local:TrivialFormatter />
      </Binding.Converter>
    </Binding>
  </Button.Width>
</Button>

Ich habe nicht getestet, weil auch Lesen es Wasser meine Augen macht ...

Ich würde auf jeden Fall in Michas Vorschlag, die auf eine statische Singleton Instanz des Wandlers beinhaltet die Verwendung. Aber ein andere Sache zu prüfen ist, dass, wenn Sie einen separaten Präsentationsmuster wie MVVM mit sind Sie oft die Forderung nach einem Wertwandler durch die Umsetzung der Umwandlung in dem Ansichtsmodell vermeiden.

Es gibt eine Menge Gründe, weshalb Sie dies tun.

Zum einen ist es viel mehr prüfbar. Ihre Unit-Tests können sicher sein, dass alles, was kommt aus dem Ansichtsmodell ist das, was von der Benutzeroberfläche angezeigt werden. Sie können eine Anforderung vorstellen, Testen, dass Dollar-Werte der aktuellen Kultur Währung Format folgen müssen, zwei Dezimalstellen verwendet werden muss, etc.

Ein weiterer guter Grund ist, dass Ausnahmen in Wertwandlern werden nicht als Validierungsfehler behandelt werden, die ein großen Schmerzen in dem Hintern in Silverlight sein können. Auch wenn Sie ValidatesOnExceptions auf true in der Bindung festgelegt, wenn Ihr Werteumwandler eine Ausnahme auslöst, wird Silverlight lassen Sie es propagieren. Wenn Sie jedoch das Ansichtsmodell verwenden, um die Konvertierung zu tun, wird eine Ausnahme als Validierungsfehler behandelt werden.

Der Nachteil ist, dass Sie einige der „Wiederverwertbarkeit“ einen allgemeinen Werteumwandler verlieren.

Ich weiß nicht, von einer Art und Weise dies die Art und Weise zu tun, um Sie sind die besagt, aber ich habe gerade versucht, dies als eine Probe und es funktionierte. In Ihrer App.xaml.cs Datei können Sie eine Methode erstellen, die verwendet Reflektion der Wandler zu laden.

private void Application_Startup(object sender, StartupEventArgs e)
{
    LoadConverters();
}

private void LoadConverters()
{
    foreach(var t in Assembly.GetExecutingAssembly().GetTypes())
    {
        if (t.GetInterfaces().Any(i => i.Name == "IValueConverter"))
        {
            Resources.Add(t.Name, Activator.CreateInstance(t));
        }
    }
}

Dann können Sie den Konverter mit wie diese, auf halbem Weg gibt, denke ich.

<Button Width="{Binding Width, Converter={StaticResource TrivialFormatter}}" />

Das Problem mit dem Ansatz ist, dass Sie schlagen vor, dass der XAML-Parser nicht weiß, wann und wie viele Instanzen des Wandlers zu erstellen. Erstellen sie als Ressource nur eine Instanz gewährleisten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top