0

我有以下情况:

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 中,状态属性的更改都不同。

  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();

我已经尝试了几个绑定指令,但它不起作用....

谢里根的解决方案:

如果您想同时显示集合中所有对象的所有属性,则 SHRIGAN 解决方案很好但是

我实际上想要实现的是拥有一个对象集合,这些对象都更新相同的视觉组件。集合中的对象代表状态,因此始终只有一个处于活动状态。所以我所做的是编辑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}"/>

}
4

1 回答 1

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。我目前无法对此进行测试。


更新>>>

听起来您的收藏中有一个空项目,它正在为它生成一个ItemTemplate(the TextBox)。但是,您实际上不必使用集合控件来显示集合中的项目......如果您只想显示一个项目,您应该能够使用索引器Binding.Path语法:

<TextBox Text="{Binding CollectionProperty[0].State}" />
于 2013-10-24T14:23:22.320 回答