11

我正在尝试实现一个 wpf 用户控件,该控件使用转换器将文本框绑定到双打列表。如何将用户控件的实例设置为转换器参数?

控件的代码如下所示

谢谢

<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>
4

4 回答 4

11

另一种方法是让您的转换器继承自 DependencyObject(或 FrameworkElement)。这允许您声明依赖项属性,从而可以从 XAML(甚至是绑定)设置其值。

示例:用于乘以指定因子的值的转换器,该因子是从自定义控件 (MyControl) 中的属性 (FactorValue) 获得的。

转换器:

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
}

在 XAML 中使用:

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

因此,您现在可以为转换器中需要的每个参数声明一个依赖属性并绑定它。

于 2011-11-16T11:56:33.793 回答
8

这些参数用于转换器所需的常量。要为您的转换器提供对象实例,您可以使用 MultiBinding。

注意:要使此解决方案起作用,您还需要修改转换器以实现 IMultiValueConverter 而不是 IValueConverter。幸运的是,所涉及的修改相当少。您可以为提供给转换器的值的数量添加验证,在您的情况下为 2。

<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>
于 2008-12-18T13:40:29.703 回答
1

我会命名控件,然后使用 ElementName 进行绑定:

<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>

不,等等,这不起作用,因为 ConverterParameter 不是 Dependency Property,Binding 也不是 DependencyObject。ReleativeSource 标记扩展应该做你想做的事,虽然我没有使用它嵌套在其他 MarkupExtension 中 - 在这种情况下它可能表现不佳:

<TextBox  Name="Textbox_baysizes" 
                      Text="{Binding RelativeSource={RelativeSource self},
                                    Path=Parent.Parent.BaySizeItemsSource, 
                                    Converter={StaticResource BaySizeConverter,
                                    ConverterParameter={RelativeSource self} }}"
                      />
于 2008-12-18T13:47:05.680 回答
1

我有同样的问题,但我不能使用 MultiBindings,因为我需要正确实现 ConvertBack 方法。这是我最终为 CheckBox 的 IsChecked 属性实施的解决方案:

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

我对 TemplateBindings (或任何与此相关的 WPF)都不是很熟悉,所以这可能只是因为我的 CheckBox 在 DataTemplate 中才有效......

于 2010-09-21T21:22:59.487 回答