2012-06-11 45 views
2

我想使用的IValueConverter到集合轉換成代理對象的數據綁定。WPF的IValueConverter沒有更新的觀點

轉換器似乎很好地工作,但是當一個新的對象被添加或從集合中刪除的問題。同樣是在視圖中不刷新..

模型對象:

public class A { 
    public ObservableCollection<string> Members { get; } 
} 

轉換

public class MemberConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     var collection = new CompositeCollection(); 
     var a = value as A; 

     a.Members.ToList().ForEach(member => { 
      collection.Add(new ProxyClass{ A= a, Member= member }); 
     }); 

     return collection; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     throw new System.NotImplementedException(); 
    } 
} 

代理類

public class ProxyClass { 
    public A A { get; set; } 

    public string Member{ get; set; } 
} 

XAML:

<DataTemplate DataType="{x:Type my:ProxyClass}"> 
      <TextBlock Text="{Binding Path=Member}"/> 
</DataTemplate> 
<HierarchicalDataTemplate DataType="{x:Type A}" ItemsSource="{Binding Converter={StaticResource MemberConverter}}"> 
      <TextBlock Text ="{Binding}"/> 
</HierarchicalDataTemplate> 

回答

0

它沒有更新,因爲你A屬性不實現INotifyPropertyChanged或者是DependencyProperty

如果需要,你可以使它實現了以前的一個後添加以下。

ItemsSource="{Binding Converter={StaticResource MemberConverter}, UpdateSourceTrigger=PropertyChanged}"> 
+0

改爲代碼來執行INotifyPropertyChanged的代理對象募集屬性更改通知「成員」,並改變了XAML作爲好。仍然沒有運氣.. – Arihant

2

如果綁定的屬性的屬性更改通知已更改,則綁定將僅被重新評估。在這種情況下,ItemsSource綁定到DataContext - A實例本身 - 因此,除非給定一個新的A實例,否則它不會被重新評估。由於給ItemsSource的值實際上是您在轉換器中創建的不同收集實例,因此沒有任何內容會收聽收集引起的更改通知。

一個選擇是讓轉換器創建一個helper類,該類綁定源集合的CollectionChanged事件(即傳遞到轉換器的值),並且該對象將負責保持源集合及其創建的集合同步中。另一個選擇是嘗試強制綁定重新評估 - 例如,使用「成員」,爲的ItemsSource的路徑結合,當你改變集合的內容上A.