Привязка данных свойства объекта к элементу коллекции на основе имени объекта - PullRequest
0 голосов
/ 09 февраля 2011

Возможно ли реализовать следующий сценарий привязки данных WPF (Silverlight)?

На странице имеется несколько пользовательских элементов управления:

<Grid x:Name="grid1">
  ...
  <My:CustCntr x:Name="name1" Property1="{Binding Property1}" />
  <My:CustCntr x:Name="name2" Property1="{Binding Property1}" />
  <My:CustCntr x:Name="name3" Property1="{Binding Property1}" />
  ...
</Grid>

Сетка DataContextявляется коллекцией ObservableCollection:

grid1.DataContext = myCollection;
...
ObservableCollection<MyEntity> myCollection= new ObservableCollection<MyEntity>();
...

Класс MyEntity имеет свойства Name и Property1.

 MyEntity me1 = new MyEntity { Name = "name1", Property1 = "5" };      
 MyEntity me2 = new MyEntity { Name = "name2", Property1 = "6" };
 MyEntity me3 = new MyEntity { Name = "name3", Property1 = "7" }; 
 ... 
 myCollection.Add(me1); 
 myCollection.Add(me2);
 myCollection.Add(me3); 
 ...    

Можно ли установить привязку данных для Property1 в каждоммоих CustomControls для соответствующего элемента myCollection, где Name CustomControl равно значению поля Name элемента коллекции?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

Обычно, что вы делаете в ситуации, когда у вас есть коллекция, которую вы хотите отобразить в пользовательском интерфейсе, это использовать 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;
                }
            }
        }
    }
}
0 голосов
/ 09 февраля 2011

Нет, это было бы невозможно.Однако вы можете использовать объект ItemsControl (есть несколько элементов управления, которые наследуют его), но тогда может быть сложнее настроить дизайн.Нет для отдельных элементов управления, но для размещения каждого CustCntr.

...