2016-07-15 24 views
2

成功と失敗の両方を説明するために、次のバックエンドを使用します。いずれの場合も、私は物事の配列を持ち、array.First()に設定されているPropertyを持っています。だからここ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; } 
} 

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

選択されるSelectedItemの項目における結合の結果であり、ここで

<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

非常に興味深い問題です。ここでは何が起こっているのですか?

あなたがやっていることは、キャッシュするのではなく、毎回新しいアイテムのコレクションを返すことです。 Item getterはItemsSource Bindingから1回、FirstItemバインディングから2回呼び出されるので、コレクションは2回インスタンス化されます。

Itemは参照型なので、Item {Index = 1}の2つのインスタンスは等しくないため、一致しないため、Selected Itemバインディングは機能しません。文字列の場合は値型であり、 "1"は異なるインスタンスでも "1"と同じであるため、文字列に対して機能します。

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

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

ありがとうございました。残念ながら、これは私が持っている問題の蒸留ダウンバージョンであり、これまでのところこれは私のアプリで問題を修正していません。 (すぐに質問をフォロー:-)) – AlSki

関連する問題