2010-09-30 7 views
1
cassé

J'ai une zone de liste déroulante définie en tant que telleSilverlight MVVM Combobox Binding se

<ComboBox Name="RoomDropDown" Visibility="{Binding Path=RoomDropDownVisible,Mode=OneWay,Converter={StaticResource BoolVisibilityConvertor}}" 
          ItemsSource="{Binding Path=RoomList,Mode=OneWay}" DisplayMemberPath="display" SelectedValuePath="display" SelectedValue="{Binding Path=Room,Mode=TwoWay}"/> 

Il y a 2 propriétés définies dans le ViewModel, RoomList qui est Liste et la propriété de chambre qui est une chaîne.

La première fois que je lance l'application, tout fonctionne correctement, et la liste déroulante obtient les valeurs correctes et les valeurs correctes sont sélectionnées. Toutefois, dans certaines conditions, la propriété RoomList est remplacée par une autre source & la propriété Room est également modifiée. Le problème qui se produit actuellement est que la zone de liste affiche les valeurs correctes mais que la valeur sélectionnée n'est pas sélectionnée. Pire, nous pouvons vivre avec cela, mais le setter est également ne tirant pas lorsque la valeur est modifiée manuellement dans le DropDown.

Des indications sur ce qui ne va pas ici?

Followup: Ne pensez pas que je réussi à obtenir exactement le problème à travers, voici quelques exemples de code que je voulais ajouter pour illustrer le problème:

<Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel VerticalAlignment="Center" Width="100"> 
     <ComboBox Name="TestBox" Height="20" Width="100" ItemsSource="{Binding Path=ComboSource}" DisplayMemberPath="display" SelectedValuePath="code" 
        SelectedValue="{Binding Path=ComboSelection,Mode=TwoWay}"/> 
     <Button Content="Click Here" Click="Button_Click" /> 
    </StackPanel> 
</Grid> 



public MainPage() 
    { 
     InitializeComponent(); 
     this.Loaded += (s, e) => 
      { 
       var temp = new List<Binding>(); 
       temp.Add(new Binding() { code = "1", display = "One" }); 
       temp.Add(new Binding() { code = "2", display = "Two" }); 
       this.ComboSource = temp; 
       this.ComboSelection = "1"; 
       this.DataContext = this; 
      }; 
    } 

    private static readonly DependencyProperty ComboSelectionProperty = 
     DependencyProperty.Register("ComboSelectionProperty", typeof(string), typeof(MainPage), new PropertyMetadata(null)); 

    public string ComboSelection 
    { 
     get { return (string)GetValue(ComboSelectionProperty); } 
     set 
     { 
      SetValue(ComboSelectionProperty, value); 
      this.RaisePropertyChanged("ComboSelection"); 
     } 
    } 

    private static readonly DependencyProperty ComboSourceProperty = 
     DependencyProperty.Register("ComboSourceProperty", typeof(List<Binding>), typeof(MainPage), new PropertyMetadata(null)); 

    public List<Binding> ComboSource 
    { 
     get 
     { 
      return (List<Binding>)GetValue(ComboSourceProperty); 
     } 
     set 
     { 
      SetValue(ComboSourceProperty, value); 
      this.RaisePropertyChanged("ComboSource"); 
     } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var temp = new List<Binding>(); 
     temp.Add(new Binding() { code = "3", display = "Three" }); 
     temp.Add(new Binding() { code = "4", display = "Four" }); 

     this.ComboSource = temp; 
     this.ComboSelection = "3"; 

    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 
} 

public class Binding 
{ 
    public string code {get; set;} 
    public string display { get; set; } 
} 

Pas strictement MVVM, mais pour expliquer la problème, lorsque l'événement de clic de bouton est déclenché, la Combosource est modifiée avec une nouvelle sélection en cours, mais cette sélection ne lie pas et le problème que j'ai mentionné ci-dessus commence à se produire.

Répondre

1

Votre SelectedValuePath est "affichage", que je suppose est une propriété de chaîne de la classe Room. Mais vous liez SelectedValue à la propriété Room de votre viewmodel, et je suppose que cette propriété est de type Room ... Donc le SelectedValue est du type string, et vous le liez à une propriété de type Room: il peut ne fonctionne pas car il n'y a pas de conversion entre ces types. Au lieu d'utiliser la propriété SelectedValue, pourquoi ne pas utiliser le code SelectedItem?

<ComboBox Name="RoomDropDown" Visibility="{Binding Path=RoomDropDownVisible,Mode=OneWay,Converter={StaticResource BoolVisibilityConvertor}}" 
      ItemsSource="{Binding Path=RoomList,Mode=OneWay}" DisplayMemberPath="display" SelectedItem="{Binding Path=Room,Mode=TwoWay}"/> 
+0

Ajout de la section de suivi à la question ci-dessus. – user457485

0

Il semble y avoir un bug dans les données ComboBox de liaison où la liaison va complètement briser si les données qu'il lie à SelectedValue devient nulle.

Placez un point d'arrêt dans le setter ComboSelection et vérifiez s'il est défini sur null. Si cela est la source du problème, ajoutez à votre setter:

public string ComboSelection 
{ 
    // ..... 
    set 
    { 
     if(value == null) 
      return; 
     // ..... 
    } 
} 

Sur une note de côté, vous avez probablement pas besoin d'utiliser une propriété de dépendance à dos ComboSelection. La liaison de données pour cela devrait fonctionner correctement sur une propriété normale tant que vous continuez à utiliser PropertyChanged.