C# UWP组合框SelectedItem忽略其绑定值

C# UWP组合框SelectedItem忽略其绑定值,c#,combobox,uwp,C#,Combobox,Uwp,为了说明成功和失败,我将使用以下后端。在每种情况下,我都有一个事物数组和一个设置为array.First()的属性 因此,这里是一个绑定结果,它会导致SelectedItem中的项被选中 <ComboBox ItemsSource="{x:Bind Strings}" SelectedItem="{x:Bind FirstString}"> <ComboBox.ItemTemplate> <Dat

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

因此,这里是一个绑定结果,它会导致
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中的值


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

非常有趣的问题。事情是这样的

基本上,您所做的是每次返回一个新的项目集合,而不是缓存它。由于Items getter被调用两次,一次从ItemsSource绑定调用,一次从FirstItem绑定调用,所以集合被实例化两次

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

要解决此问题,您需要在每次调用项目的getter时缓存并返回相同的项目实例:

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

public Item[] Items {get;set;}

您的输出窗口显示什么?这里有一个非常有趣的问题。我将在今后的面试中使用它:)谢谢Alex。不幸的是,这是我遇到的问题的简化版本,到目前为止,这还没有解决我的应用程序中的问题。(稍后跟进问题:-)
public MainPage()
{
    ...
    Items = new Item[] {...};
    ...
    FirstItem = Items.First();
}

public Item[] Items {get;set;}