2016-08-05 56 views
0

Ich habe eine UWP-App, wo bin ich eine ComboBox an ein Wörterbuch binden. Dies funktioniert bis auf ein Problem. Wenn ich versuche, den gebundenen SelectedValue in meinem Ansichtsmodell festzulegen, wird die ComboBox auf einen Nullstatus zurückgesetzt.Binding ComboBox zu Enum-Wörterbuch in UWP

Ich habe versucht, die gleiche Sache in WPF, und es hat dieses Problem nicht. Online schauend, fand ich this Seite genau das, was ich mit WPF mache, aber ich konnte nichts über UWP finden.

Was muss ich tun, damit die ComboBox beim Aktualisieren des gebundenen Werts nicht zurückgesetzt wird?

Hier ist ein vereinfachtes Beispiel. Ich verwende PropertyChanged.Fody und MvvmLightLibs

Ansicht Modell:

[ImplementPropertyChanged] 
public class ViewModel 
{ 
    public ICommand SetZeroCommand { get; set; } 
    public ICommand ShowValueCommand { get; set; } 

    public ViewModel() 
    { 
     SetZeroCommand = new RelayCommand(SetZero); 
     ShowValueCommand = new RelayCommand(ShowValue); 
    } 
    public Numbers Selected { get; set; } = Numbers.One; 
    public Dictionary<Numbers, string> Dict { get; } = new Dictionary<Numbers, string>() 
    { 
     [Numbers.Zero] = "Zero", 
     [Numbers.One] = "One", 
     [Numbers.Two] = "Two" 
    }; 

    private async void ShowValue() 
    { 
     var dialog = new MessageDialog(Selected.ToString()); 
     await dialog.ShowAsync(); 
    } 

    private void SetZero() 
    { 
     Selected = Numbers.Zero; 
    } 

    public enum Numbers 
    { 
     Zero, 
     One, 
     Two 
    } 
} 

XAML:

<Page 
    x:Class="UwpBinding.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:UwpBinding" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    DataContext="{Binding MainWindow, Source={StaticResource Locator}}"> 
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <ComboBox Margin="105,163,0,0" ItemsSource="{Binding Dict}" DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding Selected, Mode=TwoWay}"/> 
     <Button Content="Show" Command="{Binding ShowValueCommand}" Margin="25,304,0,304"/> 
     <Button Content="Set to 0" Command="{Binding SetZeroCommand}" Margin="10,373,0,235"/> 
    </Grid> 
</Page> 

Antwort

2

Ich habe eine grundlegende Demo und reproduziert Ihr Problem. Nach der Recherche fand ich das Problem: Combox.SelectedValue funktioniert nicht mit Enumeration.

Aktuelle Problemumgehung ist stattdessen SelectedIndex zu verwenden.

Zum Beispiel: in Ihrem Viewmodel die Codes ändern wie unten:

public int Selected { get; set; } = 1; 
... 
private void SetZero() 
{ 
    Selected = 0; 
} 
... 
private async void ShowValue() 
{ 
    Numbers tmp=Numbers.Zero; 
    switch (Selected) 
    { 
     case 0: tmp = Numbers.Zero; 
      break; 
     case 1:tmp = Numbers.One; 
      break; 
     case 2:tmp = Numbers.Two; 
      break; 
    } 
    var dialog = new MessageDialog(tmp.ToString()); 
    await dialog.ShowAsync(); 
} 
+0

Haben Sie einen Fehler gegen diese angemeldet? SelectedValuePath ist ziemlich sinnlos, wenn es nur mit Ganzzahlen arbeitet. :-/ Lass es mich wissen. Wenn Sie nicht haben, werde ich. Danke. –