Как привязать наблюдаемую коллекцию к многопользовательским элементам управления во время выполнения? - PullRequest
1 голос
/ 07 января 2010

Я застрял в той части, где я должен привязать коллекцию к динамическому пользовательскому контролю. Сценарий примерно такой. У меня есть динамический элемент управления, имеющий расширитель, сетку данных, поле со списком и текстовое поле, где комбо и текстовое поле находятся внутри сетки данных. С ними уже есть две коллекции. Один связан со списком, а другой связан с сеткой данных. Когда элемент изменяется в поле со списком, его соответствующее значение устанавливается равным соответствующему текстовому полю и так далее. и эта пара значений затем устанавливается на коллекцию, связанную с сеткой данных. Пользователь может добавить несколько элементов.

Теперь основная проблема заключается в том, что все это происходит внутри пользовательского элемента управления, который добавляется динамически, то есть при нажатии кнопки. Пользователь может добавить желаемое количество пользовательских элементов управления в форму. проблема в этой ситуации. Скажем, я добавил 3 элемента управления. Теперь, во-первых, если я добавлю код в коллекцию, он будет отражен и в следующих двух элементах управления, так как они связаны с одной коллекцией. Итак, я хочу знать, есть ли возможность регенерировать / переименовать одну и ту же коллекцию, чтобы не возникало вышеуказанное условие.

1 Ответ

2 голосов
/ 07 января 2010

Трудно ответить на ваш вопрос, не видя более широкой картины, однако я чувствую, что вы поступаете неправильно по этому поводу. Похоже, что вы добавляете экземпляры своего пользовательского элемента управления непосредственно из кода. Вместо этого вы должны создать какой-то ItemsControl в своем XAML, а в его 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>
...