一个文本框和子对象的ObservableCollection之间的数据绑定

时间:2013-10-24 14:09:50

标签: 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();

}

其中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}"/>

}

1 个答案:

答案 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属性设置为B1B2。这个可能可能不适用于A的实例......我暂时无法对此进行测试。


更新&gt;&gt;&gt;

听起来你的集合中有一个空项目,它为ItemTemplate生成了TextBoxBinding.Path)。但是,实际上 并不使用集合控件来显示集合中的项目...如果您只想显示一个项目,则应该能够使用索引器{{1语法:

<TextBox Text="{Binding CollectionProperty[0].State}" />