【问题标题】:Binding Collection in wpf comboBox with mvvm (C#)使用 mvvm (C#) 在 wpf comboBox 中绑定集合
【发布时间】:2019-10-11 23:42:09
【问题描述】:

我正在尝试使用 mvvm 模式和 wpf 来为以前以 win 形式完成的项目创建一个接口。 在这个项目中,我有一个包含一些 List 的对象,我必须使用组合框在我的界面上实时显示,问题是组合框不会改变他的值。我正在使用 mvvm 基金的 dll 来实现 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 并且它可以工作,但我不能在实际项目中使用它。

(ps.这是我在堆栈溢出中的第一个问题,如果我做错了对不起!)

【问题讨论】:

  • 您应该真正使用 ObservableCollection (nomen est omen) 或其他可观察的集合类型。与 ObservableCollection 不同,简单的 List 是不可观察的,因此 Combobox 无法知道何时在列表中添加、删除或替换列表在列表绑定到 ComboBox 之后。如果你不能使用 ObservableCollection,虽然很幸运(不,真的,我真诚地质疑禁止你使用 ObservableCollection 的要求。这对我来说没有任何意义,我建议你正在努力消除或规避它奇怪的要求)
  • 您是说 GenerateExecute() 中的 RaisePropertyChanged(“Word”) 不会导致 ComboBox 使用新项目更新其下拉列表吗?
  • 是的,问题是 RaisePropertyChanged(“Word” ) 没有导致 ComboBox 更新。

标签: c# wpf mvvm data-binding combobox


【解决方案1】:

像这样使用ObservableCollection

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

并将组合框 xaml 代码中的绑定模式从 OneWay 更改为 TwoWay,或者将其删除为类似

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

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2019-06-23
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2015-04-27
    • 2011-10-28
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多