簡體   English   中英

綁定ComboBox ItemsSource在WPF中不起作用

[英]Binding ComboBox ItemsSource does not work in WPF

這有點奇怪,因為我在那里發現的每個例子都說我正在以正確的方式做事但我無法讓我的ComboBox綁定在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>

我嘗試過綁定myCollection,Binding Path = myCollection,我嘗試過設置DataContext和不設置DataContext。 似乎沒有什么工作。

我已經沒有想法了,我發現的每個例子都說這是正確的方法,它應該正常工作,所以感謝我提前幫助。

InitializeComponent之后設置datacontext

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

在構造函數的末尾

comboBox1.ItemsSource = myCollection;

Sajeetheran答案可行的,因為XAML對象的初始化着眼於當前狀態,並結合還有什么在那個時候 ,但如果一個人改變的財產,以別的東西會失敗。 我認為這是一次性 的解決方案

我只是想用綁定來做這件事

對於大多數WPF場景,人們希望使用INotifyPropertyChange機制來允許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"); }
}
public List<string> myCollection { get; set; }

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

        InitializeComponent(); //-- call it at the end
    }

分配數據上下文后,您必須使用InitializeComponent

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM