首页 > 解决方案 > 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 数据上下文绑定设置到该集合.. 无济于事

绑定到静态类/对象的关键是什么?

标签: c#wpf

解决方案


绑定到静态类/对象的关键是什么?

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)}"/>

推荐阅读