2010-07-30 3 views
1

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

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}"/> 

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

ответ

3

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

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

DataContext = this; 

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

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

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

+0

Имея '

+0

Ooh, установка 'DataContext = this;' в моем конструкторе работало, когда у меня просто ' 'в XAML. Спасибо! –

+0

@Sarah In в первом случае вы присвоили имя «thisWindow» в элементе Window? »x: Name =« thisWindow »' – Jay

0

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

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

Вот пример ListBox. Я заполнил элементы из XDocument, хранящиеся в статических ресурсах. Это, возможно, объяснит связь между Связующим Источником и Путем. 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

+0

Er, что вызывает у меня ComboBox в приложении, чтобы содержать элементы списка 'р', 'R', 'о', 'd', 'и', «C ',' t ',' s '. :( –

0

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

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

КОД-ЗА:

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. WPF's ObservableDictionary. Это позволяет вам убедиться, что если элементы словаря изменится, то вы будете иметь возможность наблюдать это изменение соответствующим образом (то есть, если вы удалите/добавите ключевую пару из своего словаря, который вы используете для сортировки всегда показывать правильный список).

+0

О, и если вы новичок в WPF, я бы посмотрел на сбор книги, если вы переходите с другого языка ... приспосабливаясь к тому, как WPF делает вещи, это немного кривая обучения. Я выбрал Pro WPF на C# 2010. Это говорит Pro, но он не слишком сложный. Book + StackOverflow + Dr. WPFs site = отличный способ забрать WPF. –

3

Поместите 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}}" 
Смежные вопросы