2016-07-15 16 views
2

Um Erfolg und Misserfolge zu veranschaulichen, werde ich das folgende Backend verwenden. In jedem Fall habe ich ein Array von Dingen und eine Eigenschaft, die auf das Array festgelegt ist.First().UWP Combobox SelectedItem ignoriert seinen gebundenen Wert

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; } 
} 

so ist hier eine Bindung führt zu dem Objekt in den SelectedItem

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

Und hier ist der gleiche Code für die alternativen Elemente, die

<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> 

Zusätzlich zur Auswahl versagt sobald ich Mode=TwoWay einschalten löscht dies meinen Wert in der VM während der ersten Bindung.

Also meine Frage ist, warum? Was ist anders, um das zu verursachen?

+0

Was sagt das Ausgabefenster? –

+0

sehr interessante Frage, die Sie hier bekommen haben. Ich werde es in meinen Interviews verwenden :) – AlexDrenea

Antwort

1

Sehr interessantes Problem. Hier ist was los ist.

Im Wesentlichen tun Sie, dass Sie jedes Mal eine neue Sammlung von Elementen zurückgeben, anstatt sie zwischenzuspeichern. Da Ihr Items-Getter zweimal aufgerufen wird, einmal aus der ItemsSource-Bindung und einmal aus der FirstItem-Bindung, wird die Collection zweimal instanziiert.

Da Item ein Referenztyp ist, sind die beiden Instanzen von Item {Index = 1} nicht gleich, sodass sie nicht übereinstimmen und die Bindung des ausgewählten Elements nicht funktioniert. Es funktioniert für Strings, da diese Werttypen sind und "1" immer noch "1" ist, obwohl sie verschiedene Instanzen sind.

es zu lösen, müssen Sie die gleiche Instanz von Artikel cachen zurückkehren wird jedes Mal seine Getter genannt:

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

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

Danke Alex. Leider ist dies die heruntergebrannte Version des Problems, das ich habe, und bis jetzt hat dies das Problem in meiner App nicht behoben. (Follow-up Frage bald :-)) – AlSki

Verwandte Themen