2015-08-23 2 views
0

Это странно, потому что каждый пример, который я нашел там, говорит, что я делаю все правильно, но мне не удалось получить привязку ComboBox к работе в WPF.Binding ComboBox ItemsSource не работает в WPF

Я просто создал пустое приложение WPF.

public List<string> myCollection { get; set; } 

    public MainWindow() 
    { 
     DataContext = this; 
     InitializeComponent(); 
     myCollection = new List<string> {"test1", "test2", "test3", "test4"}; 
    } 

И вот моя XAML для этого:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ComboBox ItemsSource="{Binding Path=myCollection}" Height="23" HorizontalAlignment="Left" Margin="66,56,0,0" Name="comboBox1" VerticalAlignment="Top" Width="319" /> 
</Grid> 

Я попытался Binding MyCollection, Binding Path = MyCollection, я попытался с и без установки DataContext. Кажется, что ничего не работает.

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

ответ

1

Установите DataContext после InitializeComponent

InitializeComponent();   
myCollection = new List<string> { "test1", "test2", "test3", "test4" }; 
DataContext = this; 
1

в конце вашего конструктора

comboBox1.ItemsSource = myCollection; 
+0

Да, я знаю, что могу сделать это, и это работает, я просто хотел, чтобы сделать это с помощью привязок – RobertPorter

+0

@RobertPorter, то вы должны установить DataContext, как было предложено выше ! –

0

Sajeetheran ответ работает, потому что инициализации объектов XAML смотрит на текущее состояние и связывается с тем, что есть в то время, но не удастся, если вы измените свойство на что-то другое. Я бы назвал это одноразовоеобход.

Я просто хотел, чтобы сделать это с помощью привязок

Для большинства сценариев WPF один хочет использовать INotifyPropertyChange mechanision, чтобы обеспечить динамические изменения, которые будут обрабатываться с помощью XAML привязок. Если кто-то хочет по-настоящему использовать силу привязок, он идет рука об руку с INotifyPropertyChange. В противном случае ответ Димитрия столь же важен, как и саджетаран.


Связывающий не знает об изменениях, потому что ссылка myCollection не уведомляет мир об изменении статуса; поэтому данные не отображаются.

Для облегчения такого уведомления класс, используемый для хранения имущества, должен соответствовать INotifyPropertyChanged, а имущество myCollection необходимо отправить уведомление. (Обратите внимание, что в вашем случае это главное окно, которое технически работоспособно, но в парадигме MVVM требуется выделить представление из dat, а класс ViewModel используется для хранения фактических данных и предоставления этого примечания).

public MainWindow : INotifyPropertyChanged 

Затем обеспечивает событие, которое будет подписано на связывание целей данного пункт на DataContext:

public event PropertyChangedEventHandler PropertyChanged; 

Затем механизм, чтобы обеспечить событие изменения.

/// <summary> 
/// Raises the PropertyChanged event. 
/// </summary> 
/// <param name="propertyName">The name of the property that has changed.</param> 
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Затем обеспечивают изменение для myCollection

private List<string> _myCollection; 

public List<string> myCollection 
{ 
    get { return _myCollection; } 
    set { _myCollection= value; OnPropertyChanged("myCollection"); } 
} 
Смежные вопросы