2013-08-26 5 views
1

J'utilise WPF, MVVM et DevExpressGridControl. Il y a deux panneaux dans mon MainWindow.xaml. Panle1 a une grille et Panel2 a Textbox. Je veux que si je choisis un élément de la grille dans Panel1 son nom devrait s'afficher dans cette zone de texte Panle2. J'ai écrit le code mais ça ne marche pas. Pouvez-vous s'il vous plaît m'aider à résoudre ce problème?Comment lier des éléments sélectionnés dans MVVM

* Dans NameModel De Modèles Dossier j'ai écrit: *

private NameModelClass _selectedCustomer; 
public NameModelClass SelectedCustomer 
{ 
    get { return _selectedCustomer; } 
    set 
    { 
     if (_selectedCustomer != value) 
     { 
      _selectedCustomer = value; 
      LastName = value.LastName; 
      OnPropertyChanged("SelectedCustomer"); 
     } 
    } 

    public List<Namess> ListPerson { get; set; } 

    void CreateList() 
    { 
     ListPerson = new List<Namess>(); 
     for (int i = 0; i < 10; i++) 
     { 
      ListPerson.Add(new Namess(i)); 
     } 
    } 

    public class Namess 
    { 
     public Namess(int i) 
     { 
      FirstName = "FirstName" + i; 
      LastName = "LastName" + i; 
      Age = i * 10; 
     } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 
    } 
} 

En MianWindow.xaml j'ai écrit:

<dxdo:LayoutPanel Caption="Grid" Caption="Panel1" x:Name="abc1"> 
    <Grid> 
     <dxg:GridControl x:Name="grid" Height="233" ItemsSource="{Binding ListPerson}" AutoGenerateColumns="AddNew" HorizontalAlignment="Left" VerticalAlignment="Top" SelectedItem="{Binding SelectedNames}"> 
      <dxg:GridControl.View> 
       <dxg:TableView ShowTotalSummary="True"/> 
      </dxg:GridControl.View> 
     </dxg:GridControl> 
    </Grid> 
</dxdo:LayoutPanel> 

<dxdo:LayoutPanel Caption="Panel2" x:Name="abc1"> 
    <TextBox Width="166" Background="White" Height="33" HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding Path=LastName}"/> 
</dxdo:LayoutPanel> 

Je suis nouveau à MVVM et C#. Si ma question ne vous est pas claire, demandez-moi s'il vous plaît. Je vous remercie.

+0

Quel est le problème exact que vous rencontrez? Il y a deux choses qui ne vont pas avec votre code, dont l'une est que les propriétés de liaison n'appellent pas 'OnPropertyChanged' (' FirstName' et 'LastName'). 'ListPerson' devrait aussi être un' ObservableCollection' et non une liste régulière. Vérifiez votre fenêtre de sortie pour toute erreur de liaison. – PoweredByOrange

+0

@PoweredByOrange je veux montrer l'élément sélectionné de la grille dans la zone de texte dans Panel2 –

Répondre

0

Avez-vous essayé:

SelectedItem = "{Binding SelectedNames, mode = TwoWay}"

Après avoir regardé plus, votre principale Namess classe pourrait faire avec la mise en œuvre INotifyPropertyChanged

Avec chaque propriété l'élévation de la propriété a changé d'événement quand il ahem changements.

Utilisant également une collection observable, lorsque vous ajoutez et supprimez des éléments, elle soulève également des modifications. De cette manière, le système de changement de notification reçoit les notifications de changement de propriété pour modifier la vue en conséquence via des liaisons.

+0

Oui je l'ai fait aussi –

+0

Révisé après l'avoir lu un peu plus. – BaconSah

0

Il semble que vous ayez oublié d'élever l'événement INPC (INotifyPropertyChanged) pour la chaîne "LastName".

Donc, essayez ceci (changé est dans le dispositif de réglage ci-dessous):

public NameModelClass SelectedCustomer 
    { 
    get { return _selectedCustomer; } 
    set 
     { 
     if (_selectedCustomer != value) 
      { 
      _selectedCustomer = value; 
      LastName = value.LastName; 
      OnPropertyChanged("SelectedCustomer"); 
      OnPropertyChanged("LastName"); //<-- new 
      } 
     } 
    } 

Vous devez envoyer INPCs de sorte que la liaison sait mettre à jour à la nouvelle valeur. La liaison affichée ne "saisira" pas la nouvelle valeur de LastName lorsque vous relèverez cet événement.

+0

Oui, mais ça ne fonctionne pas :( –

+0

Oui, avez-vous ajouté la nouvelle ligne? Aussi, je suggère fortement de ne pas travailler avec des contrôles tiers en tant que débutant – Rachael

+0

oh désolé, je veux dire que j'ai mis à jour mon code avec ce code fourni –

1

je le fais de cette façon:

private Namess _selectedCustomer; 
public Namess SelectedCustomer 
{ 
    get { return _selectedCustomer; } 
    set 
    { 
     if (_selectedCustomer != value) 
     { 
      _selectedCustomer = value; 
      OnPropertyChanged("SelectedCustomer"); 
     } 
    } 

    public List<Namess> ListPerson { get; set; } 

    void CreateList() 
    { 
     ListPerson = new List<Namess>(); 
     for (int i = 0; i < 10; i++) 
     { 
      ListPerson.Add(new Namess(i)); 
     } 
    } 

    public class Namess : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public Namess(int i) 
     { 
      FirstName = "FirstName" + i; 
      LastName = "LastName" + i; 
      Age = i * 10; 
     } 
     public string FirstName { get; set; } 
     private string _lastName; 
     public string LastName 
     { 
      get 
      { 
       return _lastName; 
      } 
      set 
      { 
       if(value==_lastName) 
        return; 
       _lastName=value; 
       OnPropertyChanged("LastName"); 
      } 
     } 
     public int Age { get; set; } 
    } 
} 

et à votre avis:

<dxdo:LayoutPanel Caption="Grid" Caption="Panel1" x:Name="abc1"> 
    <Grid> 
     <dxg:GridControl x:Name="grid" Height="233" ItemsSource="{Binding ListPerson}" AutoGenerateColumns="AddNew" HorizontalAlignment="Left" VerticalAlignment="Top" SelectedItem="{Binding SelectedNames,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
      <dxg:GridControl.View> 
       <dxg:TableView ShowTotalSummary="True"/> 
      </dxg:GridControl.View> 
     </dxg:GridControl> 
    </Grid> 
</dxdo:LayoutPanel> 

<dxdo:LayoutPanel Caption="Panel2" x:Name="abc1"> 
    <TextBox Width="166" Background="White" Height="33" HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding Path=SelectedCustomer.LastName,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 
</dxdo:LayoutPanel> 

Bsically J'ai changé le type de SelectedCustomer à l'une des collections d'objets. Dans la vue, vous pouvez définir la liaison de votre TextBox directement à une propriété de SelectedCustomer.

+0

Définition de SelectedItem = "{Liaison SelectedName, Mode = TwoWay, U pdateSourceTrigger = PropertyChanged} "et SelectionMode =" Row "sur le GridControl a bien fonctionné pour moi. – mYnDstrEAm

Questions connexes