2017-04-07 81 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! –

相關問題