Frage

Ich versuche, eine WPF-Benutzersteuerung zu implementieren, die ein Textfeld auf eine Liste von Doppeln mit einem Konverter bindet. Wie kann ich die Instanz von Benutzersteuerung ist der Messumformer Parameter sein?

Der Code für die Steuerung unter

gezeigt

Danke

<UserControl x:Class="BaySizeControl.BaySizeTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:local="clr-namespace:BaySizeControl"
    >
    <UserControl.Resources>
        <local:BayListtoStringConverter x:Key="BaySizeConverter"/>
    </UserControl.Resources>
    <Grid>

        <TextBox  Name="Textbox_baysizes" 
                  Text="{Binding RelativeSource={RelativeSource self},
                                Path=Parent.Parent.BaySizeItemsSource, 
                                Converter={StaticResource BaySizeConverter}}"
                  />
    </Grid>
</UserControl>
War es hilfreich?

Lösung

Die Parameter sind für Konstanten, die von Ihrem Konverter benötigt. Um eine Objektinstanz zu Ihrem Konverter, können Sie verwenden, Multibinding.

Hinweis: Für diese Lösung zu arbeiten, müssen Sie auch Ihren Konverter modifizieren IMultiValueConverter statt IValueConverter zu implementieren. Glücklicherweise sind die Änderungen beteiligt ziemlich wenig. Sie können eine Validierung für die Anzahl der Werte legen zum Konverter zur Verfügung gestellt, 2 in Ihrem Fall.

<TextBox Name="Textbox_baysizes">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource BaySizeConverter}">
            <Binding RelativeSource="{RelativeSource self}" Path="Parent.Parent.BaySizeItemsSource"/>
            <Binding ElementName="Textbox_baysizes"/>
        </MultiBinding>
    </TextBox.Text>
</TextBox>

Andere Tipps

Eine andere Art und Weise macht Ihr Konverter, vererben DependencyObject (oder Framework). Auf diese Weise können Sie Abhängigkeitseigenschaften erklären, was es möglich macht seine Werte von XAML zu setzen, auch eine Bindung aus.

Beispiel: A-Wandler einen Wert specifing den Faktor zu multiplizieren, der von einer Eigenschaft (FactorValue) in einem benutzerdefinierten Steuerelement (MyControl) erhält

.

Der Konverter:

public class MyConverter : DependencyObject, IValueConverter
{
    // The property used as a parameter
    public double Factor
    {
        get { return (double) GetValue(FactorProperty); }
        set { SetValue(FactorProperty, value); }
    }

    // The dependency property to allow the property to be used from XAML.
    public static readonly DependencyProperty FactorProperty =
        DependencyProperty.Register(
        "Factor",
        typeof(double),
        typeof(MyConverter),
        new PropertyMetadata(1.15d));

    #region IValueConverter Members

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Use the property in the Convert method instead of "parameter"
        return (double) value * Factor;
    }

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

    #endregion
}

Verwenden Sie in XAML:

<MyConverter x:Key="MyConv"
             Factor={Binding ElementName=MyControl, Path=FactorValue}
/>

So können Sie jetzt eine Abhängigkeitseigenschaft für jeden Parameter erklären Sie in Ihrem Konverter benötigen und binden es.

würde ich die Kontrolle benennen und dann binden Element mit:

<UserControl x:Class="BaySizeControl.BaySizeTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:local="clr-namespace:BaySizeControl"
    Name="Foobar"
    >
    <UserControl.Resources>
        <local:BayListtoStringConverter x:Key="BaySizeConverter"/>
    </UserControl.Resources>
    <Grid>

        <TextBox  Name="Textbox_baysizes" 
                  Text="{Binding RelativeSource={RelativeSource self},
                                Path=Parent.Parent.BaySizeItemsSource, 
                                Converter={StaticResource BaySizeConverter,
                                ConverterParameter={Binding ElementName=Foobar} }}"
                  />
    </Grid>
</UserControl>

Nein, warten Sie, das wird nicht funktionieren, weil der Converter keine Abhängigkeitseigenschaft ist, noch ist die ein DependencyObject Bindung. Eine ReleativeSource Markup Erweiterung sollte das tun, was Sie wollen, aber ich habe es in anderer Markupextension nicht verwendet verschachtelt - vielleicht ist es nicht gut in diesem Fall verhält ich:

<TextBox  Name="Textbox_baysizes" 
                      Text="{Binding RelativeSource={RelativeSource self},
                                    Path=Parent.Parent.BaySizeItemsSource, 
                                    Converter={StaticResource BaySizeConverter,
                                    ConverterParameter={RelativeSource self} }}"
                      />

Ich hatte das gleiche Problem, aber ich kann nicht MultiBindings verwenden, da muss ich richtig ConvertBack Methode implementieren. Hier ist die Lösung, die ich für eine CheckBox der IsChecked Eigenschaft Umsetzung endete:

<CheckBox>
    <CheckBox.IsChecked>
        <Binding Converter="{StaticResource myConverter}" Path="Value">
            <Binding.ConverterParameter>
                <FrameworkElement DataContext="{TemplateBinding DataContext}" />
            </Binding.ConverterParameter>
        </Binding>
    </CheckBox.IsChecked>
</CheckBox>

Ich bin nicht super vertraut mit TemplateBindings (oder irgendetwas WPF was das betrifft), so vielleicht das funktioniert nur, weil mein CheckBox in einem ist Datatemplate ...

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