BlackCoin's Corner

In diesem Blog dreht es sich zu 90 % um den Themenbereich C# .Net

Januar 2010 - Einträge

n Strings in WPF zusammensetzten

In einer unserer Anwendungen haben wir die Anforderung, dass sich jeder einzelne Window Title, aus einem Namen für das jeweilige Fenster und dem jeweiligen variablen Firmen Namen zusammengesetzt wird. Eigentlich wäre für diesen Sachverhalt alleine kein Blogeintrag notwendig, schließlich gibt es für dieses Vorhaben ja auch genug Möglichkeiten. Jedoch wie ich erst kürzlich wieder lesen konnte, sieht so manch einer aufgrund der Vielzahl an Möglichkeiten den Wald vor lauter Bäumen nicht.

So möchte ich an dieser Stelle, mal zwei Lösungsmöglichkeiten, der Öffentlichkeit etwas näher bringen.

 

Für diesen Anwendungsfall gibt es eine Vielzahl von Lösungsmöglichkeiten, sei es mit einem AttachedProperty, Implementierung eines eigenen Windows, ein im Backend Definiertes Propperty, dass per Binding an die Oberfläche gebunden wird, … alles Möglichkeiten die mir so auf die schnelle einfallen, doch wie so oft es gibt noch weitere.

Wie Z.B. über einen Converter, wie diesen hier

public class AddUnternehmen : IValueConverter 
    { 
        #region IValueConverter Member 


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
            return string.Format("{0} - {1}", value, GlobaleDaten.AllgemeineEinstellungen.Singleton.AuthUnternehmen); 
        } 


        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
            throw new NotImplementedException(); 
        } 


        #endregion 
    }

Nachdem dieser den Application.Resources hinzugefügt wurde,

<Application.Resources> 
       <conv:AddUnternehmen x:Key="AddFirma"/> 
</Application.Resources>

kann er nun zum zusammensetzen, des Window Title benutzt werden.

<Window.Title> 
    <Binding Converter=”{StaticResource AddFirma}”> 
        <Binding.Source> 


            <!--xmlns:clr="clr-namespace:System;assembly=mscorlib"--> 
            <clr:String>Globale Suche</clr:String> 
        </Binding.Source> 
    </Binding> 
</Window.Title>

 

Und zum Ende noch die zweite versprochene Möglichkeit, welches diesen Anwendungsfall per MultiBinding zu Lösen versucht.

<Window.Title> 
    <MultiBinding StringFormat="{}{0} - {1}"> 
        <Binding> 
            <Binding.Source>


                <!--xmlns:clr="clr-namespace:System;assembly=mscorlib"-->                 
                <clr:String>Globale Suche</clr:String> 
            </Binding.Source> 
        </Binding>


        <!—xmlns:clr="clr-namespace:…"-->                 
        <Binding Path="AuthUnternehmen" Source="{x:Static Glob:AllgemeineEinstellungen.Singleton}"/> 
    </MultiBinding> 
</Window.Title>

Posted: Jan 14 2010, 09:49 von Lars Schmitt | mit 4 comment(s)
Abgelegt unter:
ContentPresenter richtig benutzen

Als erstes ein Beispiel, wie man es so oder in etwas anderer Form leider immer noch des Öfteren sehen kann.

<Grid> 
        <Button Name="button1"> 
            <Button.Template> 
                <ControlTemplate TargetType="{x:Type Button}"> 
                    <Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center">


                        <!—Warum bindet man das Content Propperty ein weiteres mal? --> 
                        <ContentPresenter Content="{TemplateBinding Content}" /> 
                    </Border> 
                </ControlTemplate> 
            </Button.Template> 
        </Button> 
    </Grid>

 

Doch bei den beiden Presenter Objekten (ItemsPresenter und ContentPresenter) ist dieses gar nicht von Nöten, denn diese beiden Objekte bringen doch diese Bindung bereits von Haus aus mit. Das einzige was an dieser Stelle also wirklich gebraucht wird, ist eigentlich nur das der TargetType des ControlTemplates, auf das richtige Control oder zumindest auf den richtigen ControlType (ContentControl oder ItemsControl) gesetzt wird.