将转换器绑定到转换器的工厂

本文关键字:转换器 工厂 绑定 | 更新日期: 2023-09-27 18:32:19

我一直在尝试找到一种方法将转换器绑定到返回转换器的属性。

我的代码如下所示。

我有一堂课。

public class ConverterFactory 
  {
    public IValueConverter AuthorizationToEnabledConverter
        {
            get
            {
                return converter......
            }
        }
  }

我有一个包含资源的UserControl和一个按钮。

 <UserControl.Resources>
   <ResourceDictionary>
        <converter:ConverterFactory x:Key="ConverterFactory" b:IsDataSource="true"/>
        <ObjectDataProvider x:Key="AutCon"  ObjectInstance="{StaticResource ConverterFactory}"       
           MethodName="AuthorizationToEnabledConverter"/>
    </ResourceDictionary>
</UserControl.Resources>
<Button IsEnabled="{Binding "Value" ,Converter={StaticResource AutCon}}" >Change</Button>

我希望能够将我的转换器绑定到某个返回IValueConverter的类中的属性。

有没有办法做到这一点?

将转换器绑定到转换器的工厂

像这样的事情怎么样:

Binding b = new Binding("AuthorizationToEnabledConverter") { Source = this.FindResource("ConverterFactory")};
this.SetBinding(YourProperty, b);

或通过 XAML:

YourProperty="{Binding Source={StaticResource ConverterFactory}, Path="AuthorizationToEnabledConverter"}"

编辑:您无法绑定绑定的Converter属性,因为它没有DependencyProperty。另一种方法是创建自定义MarkupExtension如下所示:

[MarkupExtensionReturnType(typeof(IValueConverter))]
public class ConverterDispenser:MarkupExtension
{
    public IValueConverter MainConverter
    {
        get { return new TestConverter();}
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        //with the help of serviceProvider you can get information about the surrounding elements and maybe decide depending on those information which converter to return.
        return MainConverter;
    }
}

如何使用它:

<TextBox Text="{Binding Path=Source, Converter={local:ConverterDispenser}}""></TextBox>

另一种选择是通过从 Binding 派生来实现您自己的Binding,然后为转换器添加新的 DependencyProperty。现在,您为此属性创建一个 ValueChangedCallback,每次它更改时,您都设置原始转换器。