繁体   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