我遇到以下情况:
class A { myCollection = new ObservableCollection<B>();
....
myCollection.Add(new B1());
myCollection.Add(new B2());
....
for each (B b in myCollection)
b.DoWork();
}
其中B是一个带有一组专用子类的抽象类(比方说B1,B2 ......)。 B具有“State”属性,以及由其子类重写的DoWork方法。 每个专门的DoWork中的state属性都会有不同的变化。
abstract class B {
string _state = null;
public string State
{
get
{
return _state;
}
set
{
_state = value;
OnPropertyChanged( "State" );
}
public bool DoWork();
}
class B1:B {
override public bool DoWork()
{
State = "Press button XXXX to do something";
.....
return true;
}
}
class B2:B {
override public bool DoWork()
{
State = "Press button YYYY to do something else";
....
return true;
}
}
在我的xaml文件中,datacontext是A,我不知道如何设置Binding:
<Window.DataContext>
<!-- Declaratively create an instance of A-->
<VW:A />
</Window.DataContext>
....
<TextBox Text="{Binding Path=????State????}" />
我想在调用
时使用数据绑定更改TextBox文本for each (B b in myCollection)
b.DoWork();
我尝试了几个绑定结构,但它不起作用....
解决方案感谢SHERIGAN:
如果你想要显示集合中所有对象的所有属性 togheter ,那么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" );
}
}
和xaml
<TextBox Text="{Binding Path=TEMP.State}"/>
}
答案 0 :(得分:0)
基本上,您需要在类public
中使用A
集合属性,并且还需要实现INotifyPropertyChanged
接口。然后你需要Bind
该集合属性到集合控件:
<ListBox ItemsSource="{Binding CollectionProperty}">
...
</ListBox>
然后,您可以在ItemTemplate
:
<ListBox ItemsSource="{Binding CollectionProperty}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type YourXmlNamespace:B}">
<TextBox Text="{Binding Path=State}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我觉得在XAML中使用基类是行不通的,但我可能错了。您可能必须将DataType
属性设置为B1
或B2
。这个可能或可能不适用于A
的实例......我暂时无法对此进行测试。
更新&gt;&gt;&gt;
听起来你的集合中有一个空项目,它为ItemTemplate
生成了TextBox
(Binding.Path
)。但是,实际上 并不使用集合控件来显示集合中的项目...如果您只想显示一个项目,则应该能够使用索引器{{1语法:
<TextBox Text="{Binding CollectionProperty[0].State}" />