XAML定义中的ObservableCollection =混合的项目

时间:2016-03-12 12:32:23

标签: c# xaml win-universal-app

我的C#代码:

namespace App1 {

public sealed partial class MyUserControl1 : UserControl {

    public ObservableCollection<Foo> Foos
    {
        get { return (ObservableCollection<Foo>)GetValue(FoosProperty); }
        set { SetValue(FoosProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty FoosProperty =
        DependencyProperty.Register("Foos", typeof(ObservableCollection<Foo>), typeof(MyUserControl1), new PropertyMetadata(new ObservableCollection<Foo>()));

    public MyUserControl1() {
        this.InitializeComponent();
    }
}

public class Foo : DependencyObject, INotifyPropertyChanged {

    public ObservableCollection<Bar> Bars
    {
        get { return (ObservableCollection<Bar>)GetValue(BarsProperty); }
        set { SetValue(BarsProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Bars.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BarsProperty =
        DependencyProperty.Register("Bars", typeof(ObservableCollection<Bar>), typeof(Foo), new PropertyMetadata(new ObservableCollection<Bar>()));

    public Foo() {
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

public class Bar {

    public Bar() {
    }
}
}

我的XAML代码:

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <local:MyUserControl1 x:Name="Ctrl1">
            <local:MyUserControl1.Foos>
                <local:Foo>
                    <local:Foo.Bars>
                        <local:Bar/>
                    </local:Foo.Bars>
                </local:Foo>
                <local:Foo>
                    <local:Foo.Bars>
                        <local:Bar/>
                    </local:Foo.Bars>
                </local:Foo>
            </local:MyUserControl1.Foos>
        </local:MyUserControl1>
    </Grid>
</Page>

在调试器中,我得到以下结果:

both Bar objects are in both Foo objects Bars Collection

但我期望在每个Foo Bars Collection中显示一个Bar。

在调试器中,我实际上认识到如果我从一个Collection中删除一个Bar,它就会从两个中删除 - 所以这两个集合都是对同一个对象的引用。

我很困惑

这是我在Stackoverflow中的第一个问题。 也许它已经被问过了 - 我找不到答案 - 现在已经找了很久的安静...... 虽然我是uwp和xaml的新手,但我可以想象这不是最佳做法。

Sample Project

1 个答案:

答案 0 :(得分:1)

在绑定中,您使用的是Observable集合。可观察集合具有在进行更改时更新的属性。在你的XAML上半部分

 <local:Foo>
  <local:Foo.Bars>
  <local:Bar/>
  </local:Foo.Bars>
 </local:Foo>

当前Foo计数= 1条数= 1
您要添加For Myusercontrols.foo和Foo.bar值。现在在下半部分中,您将向同一个Observable列表添加更多值Foo和Bar,您将更多值添加到同一列表中。所以,当你再次重复时,然后再 当前Foo计数= 2条数= 2 你需要的不是引用当前列表,而是创建一个新的Foo并将其添加到你的MyUserControl1