2016-07-15 79 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