【发布时间】:2013-04-19 01:15:07
【问题描述】:
我的代码上有两个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 上创建的两个列表:
public MainWindow()
{
InitializeCitiesCombo();
InitializeComponent();
// Initialize the control that checks for cameras
InitializeCameraControl();
FillCameraProperties();
DataContext = this;
}
第一个ComboBox 列表是在InitializeComponent之前创建的,所以当它的组合被创建时,它会填充特定的内容。
第二个ComboBox 列表是在InitializeComponent 之后创建的,因为它依赖于加载相机的对象,我不知道这是否是原因,但如果列表是在InitializeComponent 之后创建的,它不会填充ComboBox。
我知道还有其他方法可以在我的计算机上填写已连接摄像机的列表,但我必须使用在InitializeComponent 上创建并在InitializeCameraControl() 上启动的控件。
知道如何在InitializeComponent 之后填写此ComboBox 吗?
编辑:两个列表的声明:
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。
绑定错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'Text' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=Text; DataItem='MainWindow' (Name=''); target element is 'TextBox' (Name=''); target property is 'Template' (type 'ControlTemplate')
【问题讨论】:
-
您的相机列表使用什么类?它只是 List
还是 ObservableCollection ? -
向我们展示这两个列表的声明。他们不是
ObservableCollections,对吧? -
应该是什么样的列表?请注意,在
InitializeComponent之前创建的那个是正确的,但另一个不是。
标签: c# wpf xaml data-binding binding