Коллекция привязок в wpf comboBox с mvvm (C #) - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь использовать шаблон mvvm с wpf для создания интерфейса для проекта, ранее выполненного в форме win. В этом проекте у меня есть объект, который содержит некоторые List <>, которые я должен показывать в режиме реального времени на своем интерфейсе с помощью комбинированного списка, проблема в том, что комбинированный список не изменяет его значения. Я использую DLL mvvm для создания NotifyPropertyChanged. Я думаю сделать какую-то ошибку, но я не знаю, где это.

Я пытался сделать простой код только с одним списком в viewmodel и без модели, но результат не изменился.

<Window x:Class="ProvaComboBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ProvaComboBox"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.DataContext>
            <local:ViewModel />
        </Grid.DataContext>
        <Button Content="Generate" Command="{Binding Generate}"/>
        <Button Content="Clear" Command="{Binding Clear}"/>
        <ComboBox ItemsSource="{Binding Path=Word, Mode=OneWay}" />
    </Grid>
</Window>
//view Model
    class ViewModel:ObservableObject
    {
        private List<string> _word;

        public List<string> Word
        {
            get { return _word; }
        }
        public ViewModel()
        {
            _word = new List<string>();
        }
        public ICommand Generate

        { get { return new RelayCommand(GenerateExecute); } }

        void GenerateExecute()
        {
            _prova.Add("pippo");
            _prova.Add("pluto");
            RaisePropertyChanged("Word");
        }
        public ICommand Clear
        { get { return new RelayCommand(ClearExecute); } }

        void ClearExecute()
        {
            _prova.Clear();
            RaisePropertyChanged("Word");
        }
    }

//View: 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

Я думаю, что проблема в RaisePropertyChanged, но он работает правильно с обычными переменными. Я пробовал также использовать ObservableCollection, и это работает, но я не могу использовать его с реальным проектом.

(p.s. Это мой первый вопрос по переполнению стека, извините, если я сделал какую-то ошибку!)

1 Ответ

0 голосов
/ 26 мая 2019

использовать ObservableCollection вот так

public ObservableCollection<string> Word
        {
            get => _word;
            set
            {
                _word= value;
                RaisePropertyChanged("Word");
            }
        }

и измените режим привязки в вашем коде combobox xaml с OneWay на TwoWay или просто удалите его, например,

<ComboBox ItemsSource="{Binding Path=Word}" />
...