2017-04-07 82 views
0

我目前正在使用WPF上的CustomConverter。这就像一个泛型转换。ObservableCollection <T> on xaml

读到这个blog,找到了一种简化xaml的方法。

所以该转换器看起来像这样:

public CustomConverter : MarkupExtension, IMultiValueConverter { 

    public ParametersCollection Parameters { get; set; } 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     if(Parameters == null) 
      return Binding.DoNothing; 
     //Convertion Logic 
     //... 
    } 
    public override object ProvideValue(IServiceProvider serviceProvider) { 
     return new CustomConverter(); 
    } 
} 
public class ParametersCollection : ObservableCollection<object> { 
} 

而在我的XAML文件中,有以下几点:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:primitives="clr-namespace:System;assembly=mscorlib" 
       xmlns:converter="clr-namespace:NS.Converters"> 
    <Label> 
     <Label.Visibility> 
      <MultiBinding> 
       <converter:CustomConverter> 
        <converter:CustomConverter.Parameters> 
         <converter:ParametersCollection> 
          <primitives:String>Param1</primitives:String> 
          ... 
         </converter:ParametersCollection> 
        </converter:CustomConverter.Parameters> 
       </converter:CustomConverter> 
      </MultiBinding> 
      <!--Bindings start here --> 
     </Label.Visibility> 
    </Label> 
</UserControl> 

所以debbuging代码时,该Parameters属性为空(NULL)所以xaml不会填充集合。所以我的问题是,如何通过只使用xaml,没有C#代码来弹出参数。

回答

0

如果您在Convert方法的第一行放置断点,您会发现Parameters始终为null。那是因为你永远不会初始化它。解决方法是在构造函数中初始化该属性(或者在声明中,如果您使用C#6)。

Parameters不需要是ObservableCollection<T>,因为没有人会永远绑定它,它也不需要是非通用的子类。最后,ProvideValue()应提供您从XAML获得的Parameters的实际实例。如果您返回一个空的Parameters集合的新实例,它将不会有任何Parameters。在创建并初始化后调用ProvideValue()。目的不是为您提供自己班级的新实例,而是为像StaticResourceDynamicResource这样的标记扩展程序提供参数,并使用它们创建或检索除自己以外的其他实例的实例。

public class CustomConverter : MarkupExtension, IMultiValueConverter 
{ 
    public CustomConverter() 
    { 
     Parameters = new List<Object>(); 
    } 
    public List<Object> Parameters { get; set; } 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (Parameters == null) 
      return Binding.DoNothing; 

     // Just something that returns something, for testing 
     // Replace with your own convertion logic. 
     return String.Join(";", Parameters); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 
+0

你是对的,问题是变量未初始化。 – jcvegan

+1

@jcvegan Groovy! –

相关问题