2016-07-15 96 views
2

为了说明成功和失败,我将使用以下后端。在每种情况下,我都有一些东西,并且一个属性设置为array.First()。UWP Combobox SelectedItem忽略其绑定值

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中的值。

所以我的问题是,为什么?导致这种情况有什么不同?

+0

什么是您的输出窗口说什么? –

+0

你在这里得到了非常有趣的问题。我会在未来的采访中使用它:) – AlexDrenea

回答

1

非常有趣的问题。这是发生了什么。

基本上你正在做的是你每次都返回一个新的物品集合,而不是缓存它。由于您的Items getter被调用两次,一次从ItemsSource绑定中,一次从FirstItem绑定中,集合被实例化两次。

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

为了解决它,你需要缓存回报每一位它的getter被调用时项目的同一个实例:

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

public Item[] Items {get;set;} 
+0

谢谢亚历克斯。不幸的是,这是我遇到的问题的蒸馏版本,到目前为止,这还没有解决我的应用程序中的问题。 (很快跟进问题:-)) – AlSki