我的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的新手,但我可以想象这不是最佳做法。
答案 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