【发布时间】: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参数的构造函数,您还必须显式定义无参数构造函数(如果您愿意)——显然您没有。这就是初始化列表失败的原因,因为它调用了一个未定义的无参数构造函数。 -
感谢您的信息。可悲的是,这对我来说有点神秘。我真的很想要一些能让我朝着好的方向发展的代码,即使我必须全部重写。重点是以最简单的方式填充组合框并检索所选项目。谢谢!
-
我已经添加了答案。