InitializeComponent()之后的ComboBox的DataBinding

时间:2013-04-25 08:20:56

标签: c# wpf xaml data-binding binding

我的代码中有两个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

1 个答案:

答案 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以获得正确的订单。