我有一个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);
}
}
}
这似乎工作正常。
答案 0 :(得分:2)
ItemsControl.ItemsSource具有连接到CollectionChanged事件的逻辑,并相应地更新其Items集合。除非您从转换器返回相同的ObservableCollection实例,否则CollectionChanged通知无法通过转换器自动从Binding传播。
精确修复将取决于转换器中发生的情况。
<强>更新强>
不是将集合从一种泛型类型转换为另一种类型,而是尝试使用原始的ObservableCollection,而是更改转换器以转换单个项目,并通过在控件的ItemTemplate中使用它来将其应用于每个项目。