Wpf 一个文本框和子对象的可观察集合之间的数据绑定
我有以下情况:Wpf 一个文本框和子对象的可观察集合之间的数据绑定,wpf,c#-4.0,data-binding,observablecollection,children,Wpf,C# 4.0,Data Binding,Observablecollection,Children,我有以下情况: class A { myCollection = new ObservableCollection<B>(); .... myCollection.Add(new B1()); myCollection.Add(new B2()); .... for each (B b in myCollection) b.DoWork(); } 在我的xaml文件中,datacontext是一个,我不知道如何设置绑定: <Window.DataContext&
class A { myCollection = new ObservableCollection<B>();
....
myCollection.Add(new B1());
myCollection.Add(new B2());
....
for each (B b in myCollection)
b.DoWork();
}
在我的xaml文件中,datacontext是一个,我不知道如何设置绑定:
<Window.DataContext>
<!-- Declaratively create an instance of A-->
<VW:A />
</Window.DataContext>
....
<TextBox Text="{Binding Path=????State????}" />
我试过几种绑定指令,但都不起作用
感谢谢里根的解决方案:
如果您想将集合中所有对象的所有属性显示在一起,则SHERIGAN解决方案很好,但是
我实际上试图实现的是拥有一个对象集合,所有对象都更新相同的视觉组件。集合中的对象表示状态,因此始终只有一个活动对象。
所以我做的是编辑A类:
class A { myCollection = new ObservableCollection<B>();
....
private B temp;
myCollection.Add(new B1());
myCollection.Add(new B2());
....
for each (B b in myCollection) {
temp = b
temp.DoWork();
}
public B TEMP
{
get
{
return temp;
}
set
{
temp = value;
OnPropertyChanged( "TEMP" );
}
}
class A{myCollection=newobserveCollection();
....
私人B临时工;
myCollection.Add(新B1());
myCollection.Add(新B2());
....
对于每个(myCollection中的B){
温度=b
工作温度();
}
公共B临时工
{
得到
{
返回温度;
}
设置
{
温度=值;
不动产变更(“临时”);
}
}
在xaml中
<TextBox Text="{Binding Path=TEMP.State}"/>
}
}
基本上,类a
中需要一个public
集合属性,它还需要实现INotifyPropertyChanged
接口。然后需要将该集合属性绑定到集合控件:
<ListBox ItemsSource="{Binding CollectionProperty}">
...
</ListBox>
我觉得在XAML中使用基类是行不通的,但我可能错了。您可能需要将DataType
属性改为B1
或B2
。这对于A
的实例可能有效,也可能无效。。。我现在不能测试这个
更新>>> 听起来您的集合中有一个空项目,该项目生成了一个
ItemTemplate
(TextBox
)。但是,您实际上不必使用集合控件来显示集合中的项目。。。如果您只想显示一个项目,您应该能够使用索引器绑定。Path
语法:
<TextBox Text="{Binding CollectionProperty[0].State}" />
给出了编译错误,所以我使用了,但绑定仍然不起作用。您得到了什么错误?希望您了解并且需要为我在示例中使用的YourXmlNamespace
前缀添加一个前缀。好的,我在定义xmlns:custom=“clr namespace:mynamespace.BSubNamespace”
和
时成功了。它也可以在不声明xmlns:custom和使用
的情况下工作。核心概念是,我首先需要绑定集合,以绑定到集合中包含的对象内的属性。但现在我遇到了一个视觉问题:似乎将textbox放在列表框内会在正确的文本框下再添加一个textbox。。。有什么想法吗?我明白了,listbox会自动为mycollection中的每个对象创建一个文本框。我将我的最终解决方案发布在公开帖子中。无论如何,你能解释一下使用
和
之间的区别吗?
<ListBox ItemsSource="{Binding CollectionProperty}">
...
</ListBox>
<ListBox ItemsSource="{Binding CollectionProperty}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type YourXmlNamespace:B}">
<TextBox Text="{Binding Path=State}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Text="{Binding CollectionProperty[0].State}" />