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

时间:2013-09-23 08:34:35

标签: c# wpf

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

我的代码看起来像这样。

我上课了。

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的类中的属性。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:0)

如下:

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派生,然后为转换器添加新的DependencyProperty来实现自己的Binding。现在,您为此属性创建一个ValueChangedCallback,并且每次更改时,都会设置原始转换器。