ComboBox ItemSourceProperty теряет привязку при выборе элемента - PullRequest
0 голосов
/ 12 ноября 2018

Я трачу несколько часов на эту работу над большим проектом, поэтому я сделал простой пример.Проблема в том, что когда вы нажимаете кнопку «Добавить», он добавляет числа в исходное свойство элемента 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 голосов
/ 12 ноября 2018

ваш источник - List, он не будет уведомлять пользовательский интерфейс об обновлениях пользователей.Вы можете использовать ObservableCollection вместо этого или звонить OnPropertyChanged каждый раз после выполнения .Add

Что более важно, вы должны использовать реальный DataContext вместо вашего UI класса, и вы должны выполнить связывание вxaml не в коде позади

0 голосов
/ 12 ноября 2018

Используйте ObservableCollection вместо списка. Список не предоставляет уведомления при изменении чего-либо внутри списка.

ObservableCollection - это коллекция, которая позволяет коду вне коллекции быть в курсе, когда происходят изменения в коллекции (добавление, перемещение, удаление). Он широко используется в WPF и Silverlight, но его использование не ограничивается этим. Код может добавить обработчики событий, чтобы видеть, когда коллекция изменилась, и затем реагировать через обработчик событий, чтобы выполнить некоторую дополнительную обработку. Это может быть изменение пользовательского интерфейса или выполнение какой-либо другой операции.

См .: Какая польза от ObservableCollection в .net?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...