gpt4 book ai didi

c# - UWP Combobox SelectedItem 忽略其绑定(bind)值

转载 作者:行者123 更新时间:2023-11-30 17:37:11 26 4
gpt4 key购买 nike

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

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 中的项目被选中的绑定(bind)结果

    <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,这就会在初始绑定(bind)期间清除我在 VM 中的值。

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

最佳答案

非常有趣的问题。这是正在发生的事情。

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

因为 Item 是引用类型,所以 Item {Index = 1} 的两个实例不相等,因此它们不匹配,并且 Selected Item 绑定(bind)不起作用。它适用于字符串,因为它们是值类型,即使它们是不同的实例,“1”仍然等于“1”。

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

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

public Item[] Items {get;set;}

关于c# - UWP Combobox SelectedItem 忽略其绑定(bind)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38394056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com