使用Converter时未注册CollectionChanged事件?

时间:2011-03-18 01:44:26

标签: c# wpf observablecollection

我有一个ObservableCollection名为Collection1,我希望通过转换器绑定到ItemsSource的{​​{1}}。

当我指定转换器时,绑定不起作用 - 它仅使用转换器进行初始化,而不再使用。

当我指定转换器时,绑定有效,但用户控件无法正确显示,因为它不理解。

我了解到指定转换器时未设置ListBox事件处理程序,但是在未指定转换器时设置了该事件处理程序。我不知道为什么会这样。

总结:

工作:

CollectionChanged

工作:

<ListBox Name="theListBox" 
         Margin="8,28,8,8"
         ItemsSource="{Binding Collection1, Converter={StaticResource myConverter}}"
         ItemContainerStyle="{DynamicResource ContainerStyle}" /> 

Collection1.CollectionChanged is null.

如果有人能提供帮助,我会很感激。谢谢!


根据以下其他评论,这是我对此问题的解决方案。

我没有通过转换器绑定,而是在类中创建了一个ObservableCollection属性进行绑定,然后在代码中手动订阅了Collection1.CollectionChanged事件。

<ListBox Name="theListBox" 
         Margin="8,28,8,8"
         ItemsSource="{Binding Collection1}"
         ItemContainerStyle="{DynamicResource ContainerStyle}" /> 

Collection1.CollectionChanged is not null.

XAML看起来像:

public partial class MyScreen : UserControl
{
    public ObservableCollection<Class2> BindingCollection { get; set; }  // <-- Bind to this

    public MyScreen()
    {
        this.InitializeComponent();

        BindingCollection = new ObservableCollection<Class2>();

        Collection1.CollectionChanged += new NotifyCollectionChangedEventHandler(Collection1_CollectionChanged);
        MediViewData.Instance.ActivePatientCareReport.PropertyChanged += new PropertyChangedEventHandler(ActivePatientCareReport_PropertyChanged);

    }

    void Collection1_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        BindingCollection.Clear();

        foreach (var c1 in Collection1)
        {
            var c2 = ConvertClass1ToClass2(c1);
            if (c2 != null) BindingCollection.Add(c2);
        }
    }
}

这似乎工作正常。

1 个答案:

答案 0 :(得分:2)

ItemsControl.ItemsSource具有连接到CollectionChanged事件的逻辑,并相应地更新其Items集合。除非您从转换器返回相同的ObservableCollection实例,否则CollectionChanged通知无法通过转换器自动从Binding传播。

精确修复将取决于转换器中发生的情况。

<强>更新

不是将集合从一种泛型类型转换为另一种类型,而是尝试使用原始的ObservableCollection,而是更改转换器以转换单个项目,并通过在控件的ItemTemplate中使用它来将其应用于每个项目。