Windows Phone 7:将集合绑定到ListBox,以便集合中Item的更改在ListBox中更新

时间:2012-02-11 06:31:10

标签: c# windows-phone-7

很抱歉,如果这是基本的,但我没有找到一个很好的例子,准确描述我需要做什么来启用以下场景:

我有两个班级:

public class Thing:DependencyObject     {

    // Fields
    private string name = "";


    // Properties
    public string Name
    {
        get { return name; }
        set { name = value; }
    }


    // Dependency Properties

    public int Count
    {
        get { return (int)GetValue(CountProperty); }
        set { SetValue(CountProperty, value); }
    }

    public static readonly DependencyProperty CountProperty =
        DependencyProperty.Register("Count", typeof(int), typeof(Thing), null);


    // Methods
    public override string ToString()
    {
        return DateTime.Now.ToString() + " " + this.Name + " " + this.Count.ToString();

    }

    // Constructors

    public Thing(string name)
    {
        this.Name = name;
    }

}

和一个包含Thing对象的类

public class Things:DependencyObjectCollection     {

}

MainPage.xaml.cs文件创建了几个Thing对象并将它们添加到Things集合中。

公共部分类MainPage:PhoneApplicationPage     {         事物=新事物();

    // Constructor
    public MainPage()
    {
        InitializeComponent();
        Thing thingA = new Thing("A");
        Thing thingB = new Thing("B");
        Things.Add(thingA);
        Things.Add(thingB);


    }

    private void Action_Click(object sender, RoutedEventArgs e)
    {
        this.Things[0].Count += 1;
        Debug.WriteLine(this.Things[0].ToString());
    }
}

我的问题是如何编写绑定代码,以便ListBox显示Things对象中包含的Things,并且当Thing对象的DependencyProperty Count更改时,ListBox中的Thing对象的显示会自动更新。

具体来说,我将如何进行以下XAML以使上述情况发生 也就是说,当我向Things对象添加一个新的Thing对象时,会向ListBox添加一个新项。当我用Things对象更改现有项目时,更改将显示在ListBox中。

在Windows Phone 7中,MainPage包含一个ListBox:

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel>
            <ListBox x:Name="ThingsBox" />
            <Button x:Name="Action" Content="Action" Click="Action_Click"/>
        </StackPanel>
    </Grid>
</Grid>

2 个答案:

答案 0 :(得分:0)

如果你想以任何方式使用绑定,你应该考虑遵循更多的MVVM模式,

即使没有它,您也可以绑定到您的对象。你应该能够做类似以下的事情

//code behind main page
Things ThingCollection { get; set }


//in xaml
<MainPage x:Name="_mainPage">

    <ListBox ItemsSource="{Binding ThingsCollection}" />
</MainPage>

这是一个简单的例子,但基本上是在xaml中做什么。

答案 1 :(得分:0)

首先,我建议为您的模型使用普通旧对象(实现INotifyPropertyChanged)。依赖对象的使用是过度的。请参阅此相关问题:

INotifyPropertyChanged vs. DependencyProperty in ViewModel

为了将对象集合绑定到列表,以便在添加/删除对象时UI自动更新,您应该创建ObservableCollection并将其设置为ItemsSource ListBox

ObservableCollection<Thing> ThingsCollection { get; set }

<MainPage x:Name="_mainPage">
    <ListBox ItemsSource="{Binding ThingsCollection}" />
</MainPage>

这里的关键是ObservableCollection实现INotifyCollectionChanged,它会在集合发生变化时引发事件。 ListBox处理这些事件以保持UI同步。