【问题标题】:ComboBox ItemSourceProperty losts binding when item selected选择项目时,ComboBox ItemSourceProperty 失去绑定
【发布时间】:2018-11-12 16:13:37
【问题描述】:

我花了几个小时在这个更大的项目上工作,所以我做了一个简单的例子。问题是当您按下“添加”按钮时,它会将数字添加到 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));
    }
  }
}

【问题讨论】:

    标签: c# wpf combobox binding


    【解决方案1】:

    使用ObservableCollection 而不是列表。当列表中的内容发生变化时,列表不提供通知。

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

    见:What is the use of ObservableCollection in .net?

    【讨论】:

    • 它工作正常,谢谢。有趣的是,ListOnPropertyChanged 仅在您展开 ComboBox 之前有效。
    【解决方案2】:

    您的来源是List,它不会通知用户界面有关成员更新的信息。您可以改用ObservableCollection 或在每次使用.Add 后调用OnPropertyChanged

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

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      相关资源
      最近更新 更多