【问题标题】:DataBinding of a ComboBox after InitializeComponent()InitializeComponent() 后 ComboBox 的数据绑定
【发布时间】: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


【解决方案1】:

好的,这是您的主要问题。首先,像这样更改您的列表。

private ObservableCollection<CameraInfo> _listCamera; 
public ObservableCollection<CameraInfo> ListCameras
{
    get { return _listCamera ?? (_listCamera = new ObservableCollection<CameraInfo>()); }
}

我只为一个列表显示它,但你必须为两个列表都这样做。要填写列表,请不要重新实例化它们,而是清除它们。例如

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&lt;T&gt;ComboBox 将收到通知,请查看here 了解更多信息。并且绑定应该按预期工作。

编辑 - 为什么不应该重新实例化集合

如果您将执行以下操作以将数据放入集合中

public FillCameraInfo()
{
    ListCameras = new ObservableCollection<CameraInfo>(someData); 
}

绑定仍然会监听“旧”实例。但是您更改了ListCameras 的引用,并且没有人监听新实例。

编辑 - 为什么你什么都看不到

好吧,这有点奇怪,但就是这样。 ComboBox 绑定的声明顺序非常重要,这样才能正常工作。请查看here 以了解正确的顺序。

【讨论】:

  • 它仍然没有填充任何东西...... :(((
  • 你能解释一下你说if you would reinstantiate them, the bindings would be destroyed是什么意思吗??
  • @Sonhja Oo - 这只是一个例子。你可以使用任何你想要的东西。我只想演示如何在集合中填充数据。仅此而已...
  • 好的,您是否遇到任何绑定错误? ComboBoxes 中是否有任何内容?你有没有用调试器查看,集合包含什么?
  • 没有绑定错误,ComboBoxes 上没有出现任何内容,该集合具有正确的数据,我从未重新实例化它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2019-06-23
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多