Новичок в WPF - настройка ItemsSource в XAML не работает - PullRequest
1 голос
/ 30 июля 2010

Я новичок в WPF и пытаюсь выяснить все эти вещи, связанные с данными. Когда я делаю следующее в моем коде, мой ComboBox заполняется при запуске приложения:

public NewForm()
{
    InitializeComponent();
    Product.ItemsSource = Products;
}

public List<string> Products
{
    get { return _productsComponents.Keys.ToList(); }
}

Однако в моем XAML, когда у меня есть следующее, ComboBox не содержит никакого содержания при запуске моего приложения:

<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,116,0,0"
          Name="Product" VerticalAlignment="Top" Width="120"
          ItemsSource="{Binding Path=Products}"/>

Я ссылаюсь на что-то неправильно? Этот урок был полезен, но он никогда не устанавливал ItemsSource в XAML, всегда в C #.

Ответы [ 4 ]

3 голосов
/ 04 февраля 2011

Поместить DataContext="{Binding RelativeSource={RelativeSource Self}}" в окно:

<Window x:Class="ListViewTest.Test2.ListViewTest"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   DataContext="{Binding RelativeSource={RelativeSource Self}}"
3 голосов
/ 30 июля 2010

По умолчанию вы фактически привязываетесь не к самой форме, а к объекту, назначенному свойству DataContext. Это облегчает использование модели представления для управления всеми данными за пределами кодовых файлов.

Возможно, вы можете присвоить саму форму свойству DataContext в конструкторе

DataContext = this;

Вы также можете привязать к форме любым из нескольких способов. Вот один из них:

<Window x:Name="thisWindow" …
    <ComboBox ItemsSource="{Binding Path=Products, ElementName=thisWindow}"…

Я не думаю , что Products должно быть здесь DependencyProperty, но не указывайте меня на этом, и пока коллекция не подлежит изменению, вы не не нужно беспокоиться об обновлениях уведомлений.

0 голосов
/ 30 июля 2010

Я бы предложил ограничиться сохранением настроек привязки в коде или в XAML, а не смешивать их.В вашей ситуации вы устанавливаете ItemsSource при создании формы И в XAML.Я не уверен, почему?

В любом случае, кажется, что вы '_productsComponents' - это словарь по вашему коду.Так что я собираюсь использовать это в своих интересах в лучшей версии кода:

CODE-BEHIND:

public partial class NewForm : Window
{
    private Dictionary<String, String> _productsComponents;
    public Products
    {
        get { return _productsComponents; }
        set { _productsComponents= value; }
    }

    public NewForm()
    {
        Products = new Dictionary<String, String>();
        //Do you're dictionary loading...

        InitializeComponent();

        DataContext = this;

        ProductCmbBox.ItemsSource = Products;
        ProductCmbBox.SelectedValuePath = "Key";
        ProductCmbBox.DisplayMemberPath = "Value"; //or "Key" if you want...
    }
}

<ComboBox x:Name="ProductCmbBox" ... />

Я бы также посмотрел на: Dr.ObservableDictionary WPF .Это позволяет вам удостовериться, что, если элементы словаря изменятся, то ваш комбобокс (UI) сможет соответствующим образом наблюдать это изменение (то есть, если вы удалите / добавите пару значений ключа из своего словаря, то ваш комбобокспоказывать правильный список всегда).

0 голосов
/ 30 июля 2010

Попробуйте Binding Source = Продукты

Путь, как правило, является дополнением к исходному тексту того, как я его использовал, для случаев, когда вам нужно получить доступ к подвойству элементов, доступных в источнике.

Вот пример ListBox, который я заполнил элементами из XDocument, хранящимися в статических ресурсах.Можно надеяться, что это объясняет связь между Binding Source и Path.Root.Elements - это путь к коллекции, лежащей на спине к XDocument, указанному в источнике.Не используйте в своем механизме {StaticResource Product}, поскольку у вас нет коллекции в приложении xaml, а скорее текущий класс.

<ListBox Height="660" Name="ResponsesListBox" Width="240"
                      MouseDoubleClick="ResponsesListBox_MouseDoubleClick"
                      MouseLeftButtonDown="WindowMoveHandler"
                      ItemsSource="{Binding Source={StaticResource ResponsesXDocument}, Path=Root.Elements}"
                      ItemTemplate="{StaticResource ListBoxDataTemplate}" />

Также удобна эта шпаргалка по привязке данных WPF,Я нашел это весьма полезным: http://www.nbdtech.com/Blog/archive/2009/02/02/wpf-xaml-data-binding-cheat-sheet.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...