当选择项目时,ComboBox ItemSourceProperty失去绑定

时间:2018-11-12 16:13:38

标签: c# wpf combobox binding

我在这个大型项目上花了几个小时,所以我举了一个简单的例子。问题是,当您按下“添加”按钮时,它会将数字添加到ComboBox项源属性...很好,但是当您打开或从comboBox中选择任何项时,绑定将停止工作。 我一定很想念东西。

XAML:

....
<Grid>
    <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="82,63,0,0" 
               VerticalAlignment="Top" Width="120"/>
    <Button x:Name="AddButton" Content="Add" HorizontalAlignment="Left" 
             Margin="82,143,0,0" VerticalAlignment="Top" Width="75" 
             Click="NewNumberClick"/>
</Grid>
...

C#代码:

namespace ComboBoxBinding
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
    private List<double> _numbers;
    Binding comboBoxBinding;
    public List<double> Numbers
    {
        get
        {
            return _numbers;
        }
        set
        {
            _numbers = value;
            OnPropertyChanged("Numbers");
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        Numbers = new List<double>(){ 1.0, 2.0, 3.0};

        comboBoxBinding = new Binding();
        comboBoxBinding.Path = new PropertyPath("Numbers");
        comboBoxBinding.Mode = BindingMode.TwoWay;
        BindingOperations.SetBinding(comboBox, ComboBox.ItemsSourceProperty, comboBoxBinding);

        DataContext = this;
    }

    private void NewNumberClick(object sender, RoutedEventArgs e)
    {
        Random rand = new Random(); 
        double newNumber = 2.0 - rand.NextDouble(); 
        Numbers.Add(newNumber);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged.Invoke(this, new 
    PropertyChangedEventArgs(propertyName));
    }
  }
}

2 个答案:

答案 0 :(得分:0)

使用ObservableCollection代替列表。当列表中的内容发生更改时,列表不提供通知。

  

ObservableCollection是一个集合,它使集合外部的代码可以知道何时发生对集合的更改(添加,移动,删除)。它在WPF和Silverlight中大量使用,但不仅限于此。代码可以添加事件处理程序以查看集合何时更改,然后通过事件处理程序做出反应以进行一些其他处理。这可能是更改UI或执行其他操作。

请参阅:What is the use of ObservableCollection in .net?

答案 1 :(得分:0)

您的来源是List,它不会通知UI有关成员更新的信息。您可以改用ObservableCollection或每次执行OnPropertyChanged

后致电.Add

更重要的是,您应该使用真实的DataContext而不是UI类,并且应该在xaml中进行绑定,而不要在后面的代码中进行