2017-08-21 1 views
0

Tout à fait, donc j'ai, comme je l'ai dit, un ComboBox dans un ListBox. Ce sont les deux contrôles (projet WPF utilisant C# dans Visual Studio 2010 et MVVM).Combobox dans une zone de liste et un problème de liaison de données connexes

Je peux les créer tous bien et bien. Le ListBox contient un ObservableCollection de quelque chose appelé IntWrapper, qui contient juste et int.

ComboBox est chargé avec une ObservableCollection de quelque chose appelé MissionViewModel, qui est juste une classe qui contient quelques types de données de base. Par conséquent, ItemSource pour ListBox et ComboBox sont différents.

Je peux ajouter et éléments à la ListBox avec un bouton, qui ajoute juste un nouvel IntWrapper à ObservableCollection. Visuellement cela me donne un nouveau ComboBox, qui est peuplé.

Ce que je n'arrive pas à comprendre, c'est comment obtenir l'une des propriétés de MissionViewModel pour aller à la propriété dans IntWrapper quand je le sélectionne.

Auparavant, je viens d'utiliser une zone de texte dans la zone de liste, qui ressemblait à ceci:

<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}" ContextMenu="{StaticResource RemoveMissionToGiveMenu}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5"> 
             <StackPanel Orientation="Horizontal"> 
                <TextBlock Margin="1">Mission ID: </TextBlock> 
              <TextBox Margin="1" Text="{Binding Int, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
             </StackPanel> 
            </Border> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 

Mon (non travail) tentative par laquelle je remplace la zone de texte avec le ComboBox est la suivante:

<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}" ContextMenu="{StaticResource RemoveMissionToGiveMenu}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5"> 
             <StackPanel Orientation="Horizontal"> 
               <ComboBox DisplayMemberPath="MissionNameAndID" SelectedValuePath="Int" ItemsSource="{Binding MissionListViewModel.MissionVMs, Source={StaticResource Locator}}"></ComboBox> 
             </StackPanel> 
            </Border> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 

J'avais pensé que SelectedValuePath serait la chose que je voulais, mais cela ne semble pas fonctionner jusqu'à présent (peut-être que je ne l'utilise pas correctement).

Toute aide serait appréciée.

Répondre

1

Bind la propriété SelectedValue du ComboBox à la propriété Int du IntWrapper:

<ComboBox DisplayMemberPath="MissionNameAndID" SelectedValuePath="Int" SelectedValue="{Binding Int}" 
      ItemsSource="{Binding MissionListViewModel.MissionVMs, Source={StaticResource Locator}}" /> 

Cela devrait fonctionner à condition que la propriété IntWrapper.Int a un setter public et que la propriété Int du MissionViewModel est du même tapez la propriété Int du IntWrapper.

0

J'ai essayé de créer une solution à votre problème en fonction de votre description. Pour vous aider à mieux vous qualifier, nous aurons besoin de plus d'informations sur le MissionViewModel et les propriétés qu'il contient.

Je suppose que votre liaison ne pointe pas vers le ViewModel correct. J'ai essayé de recréer ce que vous décrivez ci-dessous et dans mon cas, la combobox est remplie avec la propriété Name de la classe MissionVm.

Ceci est le code XAML. Ici, j'ai modifié la liaison ItemsSource pour pointer directement vers ObservableCollection du DataContext de la fenêtre parente.

<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5"> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding }"></TextBlock> 
         <ComboBox Margin="20" Width="50" ItemsSource="{Binding DataContext.MissionVMs, RelativeSource={RelativeSource AncestorType=Window}}" DisplayMemberPath="Name"></ComboBox> 
        </StackPanel> 
       </Border> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Et c'est le ViewModel en fonction de votre description:

public class ViewModel : INotifyPropertyChanged 
{ 
    public ViewModel() 
    { 
     var vm1 = new MissionVM { Id = 1, Name = "111"}; 
     var vm2 = new MissionVM { Id = 2, Name = "222" }; 
     var vm3 = new MissionVM { Id = 3, Name = "333" }; 

     MissionVMs = new ObservableCollection<MissionVM> { vm1, vm2, vm3}; 

     MissionsToGive = new ObservableCollection<int> {1, 2, 3}; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public ObservableCollection<int> MissionsToGive { get; set; } 

    public int SelectedMissionToGive { get; set; } 

    public ObservableCollection<MissionVM> MissionVMs { get; set; } 
} 

public class MissionVM 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

C'est la sortie:

enter image description here

J'espère que cela aide. Si je vous ai mal compris, veuillez donner plus d'explications sur le problème.