我的代码中有两个ComboBox
:
<ComboBox Name="comboBoxSelectCamera" ItemsSource="{Binding Path=ListCameras}" SelectionChanged="comboBoxSelectCamera_SelectionChanged" />
<ComboBox Name="comboBoxCities" ItemsSource="{Binding Path=ListCities}" />
在我的Window
我有这段代码,以便ComboBox
了解Path
的来源:
<Window ....
DataContext="{Binding RelativeSource={RelativeSource Self}}"
.... >
两个组合都绑定到我在MainWindow
上创建的两个listes:
public MainWindow()
{
InitializeCitiesCombo();
InitializeComponent();
// Initialize the control that checks for cameras
InitializeCameraControl();
FillCameraProperties();
DataContext = this;
}
第一个ComboBox
列表是在InitializeComponent
之前创建的,因此在创建其组合时,它会填充特定内容。
第二个ComboBox
列表是在<{strong> InitializeComponent
之后创建的,因为它取决于加载相机的对象,而且,我不知道这是否是原因,但如果列表是在 InitializeComponent
之后创建的,则不会填充ComboBox
。
我知道还有其他方法可以在我的计算机上填充连接的摄像头列表,但是我要使用在InitializeComponent
上创建并在{{{{}}上启动的控件1}}。
如何了解如何在InitializeCameraControl()
之后填写ComboBox
?
编辑:两个列表的声明:
InitializeComponent
代码中的某处,private List<CameraInfo> ListCameras { get; set; }
private List<String> ListCities { get; set; }
:
ListCites
在代码的某处,我的控件返回已连接摄像机的列表(它有效,它有元素,但它们不显示在组合上):
ListCities = new List<String> { Madrid, Barcelona, Alicante, Valencia }
我的ListCameras = MyUserControl.ConnectedCameras; // this returns a valid list of `CameraInfo`
课程:
CameraInfo
请注意,在我们讨论此问题时,我尝试更改public class CameraInfo
{
public CameraInfo(string name, string id);
public static implicit operator string(CameraInfo cameraInfo);
public string Id { get; }
public string Name { get; }
public override string ToString();
}
的相机组合。
绑定错误:
DisplayMemberPath
答案 0 :(得分:2)
好的,有你的主要问题。首先,像这样更改您的列表。
private ObservableCollection<CameraInfo> _listCamera;
public ObservableCollection<CameraInfo> ListCameras
{
get { return _listCamera ?? (_listCamera = new ObservableCollection<CameraInfo>()); }
}
我只是为一个列表显示它,但你必须为它们做这个。要填写列表,请不要重新实例化它们,但要清除它们。 E.g。
private void FillCameraInfo()
{
IEnumerable<CameraInfo> example = new[] { new CameraInfo(), new CameraInfo() };
ListCameras.Clear();
foreach(var exampleEntry in example)
ListCameras.Add(exampleEntry);
}
这只是一个例子,所以我尽量保持简单。如果要重新实现它们,绑定将被“销毁”。
第一个ComboBox
被正确填充的原因在于,在使用绑定初始化组件之前,您正在填充它。所以可以找到物品。第二个ComboBox
不知道ListCities
中的更改,因为它未通知它。如果您使用ObservableCollection<T>
,系统会通知ComboBox
,请查看here了解详情。绑定应该按预期工作。
编辑 - 为什么不应重新实施馆藏
如果您要执行以下操作将数据放入集合
public FillCameraInfo()
{
ListCameras = new ObservableCollection<CameraInfo>(someData);
}
绑定仍然会监听'旧'实例。但是您更改了ListCameras
的引用,并且没有人监听新实例。
编辑 - 为什么看不到任何内容
好的,这有点奇怪,但它就像是。声明ComboBox
绑定的顺序非常重要,因此它可以正常工作。请查看here以获得正确的订单。