UWP 组合框选定项忽略其绑定值

本文关键字:绑定 组合 UWP | 更新日期: 2023-09-27 17:57:02

为了说明成功和失败,我将使用以下后端。在每种情况下,我都有一个事物数组,以及一个设置为数组的属性。第一()。

public class MainPage
{
    public MainPage()
    {
        this.InitializeComponent();
        FirstString = Strings.First();
        FirstItem = Items.First();
    }
    public string FirstString { get; set; }
    public Item FirstItem { get; set; }
    public string[] Strings => new[] {"1", "2", "3", "4"};
    public Item[] Items => new[]
    {
        new Item {Index = 1},
        new Item {Index = 2},
        new Item {Index = 3},
        new Item {Index = 4}
    };
}
public class Item
{
    public int Index { get; set; }
}

所以这里是选择SelectedItem中的项目的绑定结果

    <ComboBox ItemsSource="{x:Bind Strings}" 
          SelectedItem="{x:Bind FirstString}">
        <ComboBox.ItemTemplate>
            <DataTemplate x:DataType="system:String">
                <TextBlock Text="{x:Bind}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

这是无法选择的替代项的相同代码

    <ComboBox ItemsSource="{x:Bind Items}" 
          SelectedItem="{x:Bind FirstItem}">
        <ComboBox.ItemTemplate>
            <DataTemplate x:DataType="local:Item">
                <TextBlock Text="{x:Bind Index}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

此外,一旦我打开Mode=TwoWay这将在初始绑定期间清除我在 VM 中的值。

所以我的问题是,为什么?造成这种情况的不同是什么?

UWP 组合框选定项忽略其绑定值

非常有趣的问题。这是怎么回事。

从本质上讲,您正在做的是每次都返回一个新的项目集合,而不是缓存它。由于您的 Items getter 被调用了两次,一次来自 ItemsSource 绑定,一次来自 FirstItem 绑定,因此集合被实例化两次。

由于 Item 是引用类型,因此 Item {Index = 1} 的两个实例不相等,因此它们不匹配,并且"选定项"绑定不起作用。它适用于字符串,因为这些是值类型,并且"1"仍然等于"1",即使它们是不同的实例。

要解决它,您需要在每次调用其 getter 时缓存返回相同的 Items 实例:

public MainPage()
{
    ...
    Items = new Item[] {...};
    ...
    FirstItem = Items.First();
}
public Item[] Items {get;set;}