【问题标题】:Add item to ComboBox in WPF mvvm将项目添加到 WPF mvvm 中的 ComboBox
【发布时间】:2020-03-17 19:50:52
【问题描述】:

我正在处理 WPF 和 MVVM 中的 ComboBox,但我找不到如何实时填充 ComboBox。

private ObservableCollection<AudioListaDevice> _audiodevicesitem = new ObservableCollection<AudioListaDevice>{
//Adding my first Item to test it
        new AudioListaDevice { AudioDeviceItem = "Test 01"},
        new AudioListaDevice { AudioDeviceItem = "Test 02"},
};
        public IEnumerable<AudioListaDevice> AudioDevicesItem { get { return _audiodevicesitem; } }
        private AudioListaDevice _AudioDevice;
        public AudioListaDevice AudioDevice
        {
            get
            { return _AudioDevice; }
            set
            {
                _AudioDevice = value; OnPropertyChanged("AudioDevice");
                //On Selection 
                Debug.WriteLine(_AudioDevice.AudioDeviceItem.ToString());
            }
        }

这是类

public class AudioListaDevice : INotifyPropertyChanged
    {
        private string _AudioDeviceItem;
        public string AudioDeviceItem
        {
            get { return _AudioDeviceItem; }
            set { _AudioDeviceItem = value; OnPropertyChanged("AudioDeviceItem"); }
        }

        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

    }

我想做的是稍后从任何地方在集合中添加一个新项目并刷新组合框。

public MainWindowVM() 
        {
            _audiodevicesitem.Add(new AudioListaDevice("Test03"));

//not relevant code continues here...
}

这是 Xaml 绑定

<ComboBox x:Name="listaoutputdevices" 
          ItemsSource="{Binding AudioDevicesItem}"
          DisplayMemberPath="AudioDeviceItem"
          SelectedItem="{Binding AudioDevice}" 
          Grid.Row="0" Grid.Column="0" Margin="60,5,0,5" HorizontalAlignment="Left"  Width="352" >

错误表明我没有带有参数的构造函数通过 AudioListaDevice 传递字符串,但如果我在 AudioListaDevice 类中声明它:INotifyPropertyChanged

    private string item;
    public AudioListaDevice(string item)
        {
            this.item = item;
        }

然后

private ObservableCollection<AudioListaDevice> _audiodevicesitem = new ObservableCollection<AudioListaDevice>{
//Adding my first Item to test it
        new AudioListaDevice { AudioDeviceItem = "Test 01"},
        new AudioListaDevice { AudioDeviceItem = "Test 02"},
};

添加前面的项目时出错,并且 ComboBox 不反映

_audiodevicesitem.Add(new AudioListaDevice("Test03"));

谢谢!:)

【问题讨论】:

  • 最后一条错误信息是什么??
  • 重点是,无参构造函数是可选的,只有在根本没有定义其他构造函数时。在这种特殊情况下,它将自动生成。但是,一旦您定义了构造函数,编译器就会假定每个未定义的构造函数都被故意遗漏了。这意味着一旦您定义了采用string 参数的构造函数,您还必须显式定义无参数构造函数(如果您愿意)——显然您没有。这就是初始化列表失败的原因,因为它调用了一个未定义的无参数构造函数。
  • 感谢您的信息。可悲的是,这对我来说有点神秘。我真的很想要一些能让我朝着好的方向发展的代码,即使我必须全部重写。重点是以最简单的方式填充组合框并检索所选项目。谢谢!
  • 我已经添加了答案。

标签: c# wpf combobox


【解决方案1】:

关键是,无参数构造函数是可选的,只有当根本没有定义其他构造函数。在这种特殊情况下,它将自动生成,以便编译器能够创建该类型的实例。但是,一旦您定义了构造函数,编译器就会假定每个未定义的构造函数都被故意遗漏了。这意味着一旦您定义了带有string 参数的构造函数,您还必须显式定义无参数默认构造函数(如果您愿意的话)——显然您还没有。这就是初始化列表失败的原因,因为它调用了一个未定义的无参数构造函数。

// Invokes the parameterless default constructor
new AudioListaDevice { AudioDeviceItem = "Test 01"}

解决办法是定义一个默认构造函数:

public class AudioListaDevice : INotifyPropertyChanged
{ 
  // Parameterless default constructor
  public AudioListaDevice() : this(string.Empty)
  {
  }

  public AudioListaDevice(string audioDeviceItem)
  {
    this.AudioDeviceItem = audioDeviceItem;
  }

  private string _AudioDeviceItem;
  public string AudioDeviceItem
  {
    get { return _AudioDeviceItem; }
    set { _AudioDeviceItem = value; OnPropertyChanged("AudioDeviceItem"); }
  }

  public void OnPropertyChanged(string propertyName)
  {
    if (PropertyChanged != null)
    {
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
}

或者,如果您不想定义无参数构造函数,则正确使用现有构造函数进行实例化:

private ObservableCollection<AudioListaDevice> _audiodevicesitem = new ObservableCollection<AudioListaDevice>
{
  //Adding my first Item to test it
  new AudioListaDevice("Test 01"),
  new AudioListaDevice("Test 02")
};

推荐阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2016-01-19
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多