绑定ComboBox ItemsSource在WPF中不起作用

时间:2015-08-23 12:43:11

标签: c# wpf xaml binding combobox

这有点奇怪,因为我在那里发现的每个例子都说我正在以正确的方式做事但我无法让我的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。 似乎没什么用。

我已经没有想法了,我发现的每个例子都说这是正确的方法,它应该正常工作,所以感谢我提前帮助。

4 个答案:

答案 0 :(得分:3)

InitializeComponent

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

答案 1 :(得分:3)

在构造函数的末尾

comboBox1.ItemsSource = myCollection;

答案 2 :(得分:0)

Sajeetheran的回答是有效的,因为XAML对象的初始化会查看当前状态并与当时的绑定,但如果将属性更改为其他内容,则会失败。我会说一次性 解决方法

  

我只想用绑定

来制作它

对于大多数WPF方案,人们希望使用INotifyPropertyChange机制来允许XAML绑定处理动态更改。如果想要真正使用绑定的强大功能,它将与INotifyPropertyChange齐头并进。否则,迪米特里的答案与萨杰特哈伦的答案一样有效。

绑定不知道更改,因为myCollection的引用不会通知全世界状态的变化;因此数据无法显示。

为了便于此类通知,用于保存属性的类需要遵守INotifyPropertyChanged,并且属性myCollection需要发送通知事件。 (请注意,在您的情况下,它是主窗口,在技术上可行,但在MVVM范例中,您希望从数据中分离视图,并使用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"); }
}

答案 3 :(得分:0)

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