c# - WPF ComboBox 绑定到静态数组(或集合)
问题描述
我在 ComboBox 绑定上看到的所有内容都显示了与我尝试做的不同的实现,并且我自己配置它的尝试都失败了。
这是我正在尝试完成的一个简单示例。
代码文件:
namespace TestApp
{
public record ItemInfo
{
public int ID;
public string name;
public string description;
public decimal value;
public bool available;
}
public static class Data
{
public static ItemInfo[] myItems = new ItemInfo[10];
}
}
XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestApp"
x:Class="TestApp.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.DataContext>
<Binding Source="local:Data"/>
</Grid.DataContext>
<ComboBox Grid.Row="0"
VerticalAlignment="Center" HorizontalAlignment="Center"
Width="400" Height="40"
ItemsSource="{Binding myItems[]}" DisplayMemberPath="name">
</ComboBox>
</Grid>
</Window>
附带说明一下,为了避免混淆,我有一个单独的方法(未显示)来填充 myItems 数组。我知道这是有效的并且包含所需的数据,因为当程序运行时,我可以对其进行监视并查看数组中的正确值。
我试图做的是让 ComboBox 包含所有 Data.myItems[].name 值。上面的代码显示了我最近一次绑定它的尝试,虽然它构建成功并且没有抛出任何错误,但 ComboBox 仍然是空的。
在 myItems[] 绑定下有一个 intellisense ... 错误,指出“未找到绑定 myItems{} 的数据上下文”
我还尝试将 myItems[] 移动到 Grid.DataContext -- <Binding Source="local:Data:myItems[]} 并将 ItemsSource 设置为 {Binding Path="name"} 无济于事。
还尝试创建 ItemInfo 记录的静态集合,并将 Grid 数据上下文绑定设置到该集合.. 无济于事
绑定到静态类/对象的关键是什么?
解决方案
绑定到静态类/对象的关键是什么?
1)获取静态成员的值
为了不迷惑自己,最好将可绑定成员设为只读属性:
public static class Data
{
public static ItemInfo[] MyItems {get;} = new ItemInfo[10];
}
<ComboBox Grid.Row="0"
VerticalAlignment="Center" HorizontalAlignment="Center"
Width="400" Height="40"
ItemsSource="{x:Static local:Data.MyItems}"
DisplayMemberPath="name">
您可以通过相同的方式获取 Enum 值。
2) 绑定静态属性。
绑定意味着“跟踪”源属性值的变化。为此,您需要创建一个静态事件。
时钟的静态包装器并绑定到它的示例:
using System.Threading;
public static class ClockForWpf
{
private static readonly Timer timer = new Timer(Tick, null, 0, 10);
private static void Tick(object state)
{
Time = DateTime.Now;
TimeChanged?.Invoke(null, EventArgs.Empty);
}
public static event EventHandler TimeChanged;
public static DateTime Time { get; private set; }
}
<TextBlock Text="{Binding Path=(local:ClockForWpf.Time)}"/>
推荐阅读
- linux - Google Mock Linux 上的免费系统功能总是以内存泄漏结束
- python - 如何将 xlsb 文件添加到 Kedro 的目录中?
- asp.net-core-webapi - 通用记录器中的 Serilog 缺少异常
- django - 我如何根据方法订购商品
- git - 在 rebase 期间中止 git commit - 分阶段的更改丢失
- php - PHP zeropad (sprintf) AND number_format 总计
- c# - NullReferenceException:调用 transform.localScale 时未将对象引用设置为对象的实例
- reactjs - 如何在反应中为输入标签编写验证?
- python - S3 单元测试 boto 客户端
- javascript - 使用 ReactJS 自定义分页