2012-06-11 2 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 as Что ж. Еще не повезло .. – Arihant

2

Переплет будет пересмотрен только в том случае, если было изменено уведомление об изменении свойства для связанного с ним имущества. В этом случае ItemsSource привязан к DataContext - самому экземпляру A, поэтому, если ему не задан новый экземпляр A, он не будет переоценен. Ничто не слушает уведомления об изменениях, которые возникают в коллекции, поскольку значение, указанное для элемента ItemsSource, фактически представляет собой другой экземпляр коллекции, который вы создаете в своем конвертере.

Один из вариантов заключается в том, чтобы конвертер создавал вспомогательный класс, который перехватывает событие CollectionChanged из исходной коллекции (то есть значение, переданное в конвертер), и этот объект будет нести ответственность за сохранение исходной коллекции и той, которую она создает в синхронизации. Другой вариант - попытаться заставить привязку получить переоценку - например, используйте путь «Members» для привязки ItemsSource, и когда вы измените содержимое коллекции, добавьте уведомление об изменении свойства для «Members» на A.