You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中ComboBox的DisplayMemberPath绑定ICameraInfo索引器值报错如何解决

错误诱因

  1. 绑定属性名拼写错误:ViewModel中定义的数据源属性为CamerasFound,原XAML代码中绑定写为CameraFound,缺少末尾的s,首先存在数据源绑定错误。
  2. 索引器写法不符合规范:DisplayMemberPath="[bpy:CameraInfoKey.FriendlyName]"的写法会将方括号内的整段内容当作字符串常量传入索引器,不会自动解析为CameraInfoKey.FriendlyName的静态属性值,相当于传入了无效的字符串key,自然无法读取到对应参数。

解决方法

方案1:XAML层面直接修正(无需修改ViewModel)

不用DisplayMemberPath,改用ItemTemplate自定义选项展示内容,通过x:Static标记明确指定索引键为静态类属性,正确写法如下:

<Window
...
xmlns:bpy="clr-namespace:Basler.Pylon;assembly=Basler.Pylon"/>
...
<ComboBox Name="CamerasList" ItemsSource="{Binding CamerasFound}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=[{x:Static bpy:CameraInfoKey.FriendlyName}]}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

方案2:ViewModel层封装(更易维护)

如果后续需要扩展相机的展示字段,推荐在ViewModel层对ICameraInfo做轻量封装,避免XAML中复杂的索引器绑定写法:
首先定义相机展示包装类:

public class CameraDisplayItem
{
    public ICameraInfo RawCameraInfo { get; init; }
    public string FriendlyName => RawCameraInfo[CameraInfoKey.FriendlyName];
}

修改ViewModel的数据源属性:

using Basler.Pylon;
...
public List<CameraDisplayItem> CamerasFound { get; } = CameraFinder.Enumerate()
    .Select(info => new CameraDisplayItem { RawCameraInfo = info })
    .ToList();

XAML直接绑定封装后的属性即可:

<ComboBox Name="CamerasList" ItemsSource="{Binding CamerasFound}" DisplayMemberPath="FriendlyName" />

内容的提问来源于stack exchange,提问作者Maxime Charrière

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 21:18:00