Обычно, что вы делаете в ситуации, когда у вас есть коллекция, которую вы хотите отобразить в пользовательском интерфейсе, это использовать ItemsControl
, ListBox
и т. Д. И устанавливать для ItemsSource значение Collection.Пример
<ItemsControl Name="itemsControl1"
ItemsSource="{Binding MyCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<My:CustCntr Property1="{Binding Property1}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Теперь DataContext для каждого CustCntr
будет экземпляром MyEntity
, а привязка будет установлена в диапазоне от CustCntr.Property1
до MyEntity.Property1
Тосказал, что я не уверен в причинах вашей текущей реализации, поэтому, если вы хотите создать привязки на основе имени, я думаю, вам придется прибегнуть к коду за
Xaml
<Grid Name="grid1" Loaded="Grid_Loaded">
<My:CustCntr x:Name="name1" />
<My:CustCntr x:Name="name2" />
<My:CustCntr x:Name="name3" />
<!--...-->
</Grid>
Код позади
public ObservableCollection<MyEntity> MyCollection
{
get;
private set;
}
Обновление
Вызывайте этот метод, SetBindings, каждый раз, когда вы изменяете коллекцию в коде.Кроме того, используйте событие Loaded для сетки, чтобы установить все привязки при первой загрузке.
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
SetBindings();
}
private void SetBindings()
{
foreach (UIElement element in grid1.Children)
{
if (element is CustCntr)
{
CustCntr custCntr = element as CustCntr;
foreach (MyEntity myEntity in MyCollection)
{
if (custCntr.Name == myEntity.Name)
{
Binding property1Binding = new Binding("Property1");
property1Binding.Source = myEntity;
property1Binding.Mode = BindingMode.TwoWay;
custCntr.SetBinding(CustCntr.Property1Property, property1Binding);
break;
}
}
}
}
}