我被困在我必须将集合绑定到动态usercontrol的部分。场景就是这样的。 我有一个动态控件,有一个扩展器,数据网格,组合框和文本框,其中combox和textbox在datagrid中。他们已经有两个集合了。一个用combobox绑定,另一个用datagrid绑定。当项目在combox中更改时,其各自的值将设置为其各自的文本框,依此类推。然后将这对值设置为与datagrid绑定的集合。用户可以添加多个项目。
现在主要问题是所有这些事情都发生在动态添加的用户控件中,即按钮点击事件。用户可以向表单添加所需数量的用户控件。 这个问题正在进行中。说我添加了3个控件。现在在第一个,如果我向集合添加一个代码,那么它也会反映在接下来的两个控件中,因为它们与相同的集合绑定。 所以,我想知道是否有重新生成/重命名相同的集合,以便不会出现上述情况。
答案 0 :(得分:2)
如果没有看到更大的图片,很难回答你的问题,但是我有一种感觉,你会以错误的方式解决这个问题。您似乎直接从代码添加用户控件的实例。您应该在XAML中创建某种ItemsControl
,而在其ItemTemplate
中拥有您的用户控件,而不是这样做。将ItemsControl
绑定到视图模型中的集合,并仅操作该集合。
您不应该在视图模型或后面的代码中引用可视控件。每当你发现自己直接从代码中引用视觉元素时,它应该在你的脑海中引出一个警告标志“嘿!还有比这更好的方法!”......
示例:
视图模型:
public class ViewModel
{
public ObservableCollection<MyDataObject> MyDataObjects { get; set; }
public ViewModel()
{
MyDataObjects = new ObservableCollection<MyDataObject>
{
new MyDataObject { Name="Name1", Value="Value1" },
new MyDataObject { Name="Name2", Value="Value2" }
};
}
}
public class MyDataObject
{
public string Name { get; set; }
public string Value { get; set; }
}
包含列表框和数据模板的窗口XAML片段:
<Window.Resources>
...
<DataTemplate x:Key="MyDataTemplate">
<local:MyUserControl/>
</DataTemplate>
</Window.Resources>
...
<ListBox ItemsSource="{Binding MyDataObjects}"
ItemTemplate="{StaticResource MyDataTemplate}"
HorizontalContentAlignment="Stretch"/>
用户控件:
<UniformGrid Rows="1">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Value}" HorizontalAlignment="Right"/>
</UniformGrid>