2009-05-10 5 views
2

Ich möchte eine Bindung festlegen. Das Problem besteht darin, dass das Ziel vom Typ string ist, die Quelle jedoch vom Typ double ist. Im folgenden Code ist VersionNumber vom Typ double. Wenn ich das ausführe, ist der Textblock leer, ohne irgendwelche Ausnahmen zu werfen. Wie kann ich diese Bindung festlegen?Wie kann ich eine Zeichenfolge in WPF doppelt binden?

<Style TargetType="{x:Type MyControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type MyControl}"> 
       <TextBlock Text="{TemplateBinding Property=VersionNumber}" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter>   
</Style> 
+0

Ist es möglich, dass die 'VersionNumber' -Eigenschaft, an die Sie binden, kein Double ist, was erklären könnte, warum Sie nicht das von Ihnen erwartete Bindungsverhalten sehen? – yzorg

Antwort

5

Sie benötigen einen Konverter:

namespace Jahedsoft 
{ 
    [ValueConversion(typeof(object), typeof(string))] 
    public class StringConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return value == null ? null : value.ToString(); 
     } 

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

Jetzt können Sie es wie folgt verwenden:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:j="clr-namespace:Jahedsoft"> 

    <j:StringConverter x:Key="StringConverter" /> 
</ResourceDictionary> 

... 

<Style TargetType="{x:Type MyControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type MyControl}"> 
       <TextBlock Text="{TemplateBinding Property=VersionNumber, Converter={StaticResource StringConverter}}" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter>   
</Style> 
+0

Sie benötigen hierfür keinen Konverter, wenn Sie das Format .ToString akzeptieren oder SP1 verwenden und die Eigenschaft StringFormat der Bindung verwenden können. Das Problem ist woanders. –

+0

Dies ist eine generische Methode, die von cource ohne SP1 funktioniert. – CSharper

3

Sie benötigen keine Valueconverter benötigen. Double to String-Ziele funktionieren gut. Binding ruft in der Regel ToString() als letzten Ausweg auf.

Hier ist ein Beispiel:

<Window x:Class="WpfApplication1.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="w1"> 
     <TextBlock Text="{Binding Path=Version, ElementName=w1}" /> 
</Window> 
using System; 
using System.Windows; 
namespace WpfApplication1 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 
     public double Version { get { return 2.221; } } 
    } 
} 

Das Problem ist wahrscheinlich, dass Ihre Bindung Quelle ist nicht das, was Sie denken, es ist. In der Regel verursachen Bindungsfehler in WPF keine Ausnahmen. Sie protokollieren jedoch ihre Fehler. Siehe How can I debug WPF bindings?

+0

Double to String Ziele funktionieren NICHT. –

+2

Moheb, versuchen Sie das einfache Beispiel. Double to String ist sehr häufig und ist die ganze Zeit erledigt –

4

Es gibt einen kleinen Unterschied in den Beispielen.

Das Binden eines Double an die Text-Eigenschaft funktioniert einwandfrei, wenn Sie einen Texblock direkt in Window oder einem anderen Steuerelement verwenden, da standardmäßig die ToString() -Methode verwendet wird, ABER dies funktioniert nicht, wenn Sie versuchen, es zu verwenden ein ControlTemplate.

Dann brauchen Sie einen Konverter wie es in der Post vorgeschlagen wurde.

Verwandte Themen