2012-05-10 4 views
0

J'utilise MVVM et j'ai une vue qui permet aux utilisateurs de soumettre un message (comme un blog) où la liste "continue à peupler avec des messages postés". Lorsqu'ils cliquent sur Enregistrer, cela déclenche la commande d'enregistrement dans le modèle de vue pour enregistrer le message. Mon problème est, mon gridview à l'intérieur de ma listview ne met pas à jour. Je veux savoir si quelqu'un peut m'aider. Je suis à un point où je tourne en rond. Je sais que je manque un peu de code, mais pas mes cellules cérébrales.mise à jour listview de viewmodel

mon XAML:

<Grid Name="grdMessage" HorizontalAlignment="Left" Width="816"> 
<Grid.RowDefinitions> 
    <RowDefinition Height="auto"></RowDefinition> 
    <RowDefinition Height="auto"></RowDefinition> 
    <RowDefinition Height="auto"></RowDefinition> 
    <RowDefinition Height="auto"></RowDefinition> 
    <RowDefinition Height="auto"></RowDefinition> 
    <RowDefinition Height="auto"></RowDefinition> 
    <RowDefinition Height="auto"></RowDefinition> 
</Grid.RowDefinitions> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="auto"></ColumnDefinition> 
</Grid.ColumnDefinitions> 

<TextBlock Grid.Row="0" Grid.Column="0" Text="Messages" HorizontalAlignment="Left" VerticalAlignment="Bottom" /> 

<ListView Name="lstMessage" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Bottom" 
      Width="762" Height="auto" Margin="15,0,0,0" ItemsSource="{Binding Path=MessageList}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="462" Header="Message"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
          <TextBlock Text="{Binding Path=Message, Mode=TwoWay}" TextAlignment="Left" HorizontalAlignment="Left" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Width="150" Header="Submitter"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Path=Submitter, Mode=TwoWay}" TextAlignment="Left" HorizontalAlignment="Left" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 
<TextBox Name="txtNewMessage" Grid.Row="4" Grid.Column="0" 
     HorizontalAlignment="Left" VerticalAlignment="Top" 
     Width="762" Height="auto" TextWrapping="Wrap" 
     AcceptsReturn="True" HorizontalScrollBarVisibility="Auto" 
     Visibility="Collapsed" Text="{Binding Path=Message, Mode=TwoWay}"/> 

<Button Name="btnAddMessage" Grid.Row="6" Grid.Column="0" Content="Add" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,0,0" Command="{Binding Path=Save}" /> 

mon viewmodel:

Message message; 

ObservableCollection<Message> messageList;
RelayCommand save;

public ObservableCollection<Message> MessageList 
    { 
     get 
     {  

if (messageList == null) 
        messageList = new ObservableCollection<Message>(); 
     } 
    } 

    public ICommand Save 
    { 
     get 
     { 
      return saveCmd ?? (save = new RelayCommand(parameter => SaveMessage())); 
     } 
    } 

    void SaveMessage() 
    { 

this.MessageList.Add (this.Message); dataSource.AddMessage (message);

} 


    Message Model 

    string message; 

[DataMember] 
public int Submitter {get; set;} 

[DataMember] 
public string Message 
{ 
    get{ return(message);} 
    set 
    { 
     if (message != value) 
     { 
      message = value; 
      OnPropertyChanged("Message"); 
     } 
    } 
} 
+2

Est-ce quelque part dans le code quelque chose comme messageList.add (myNewMessage); ? – Klaus78

+0

Vous ajoutez à la base de données, mais mettez-vous également à jour le messageList? – Dabblernl

Répondre

1

affichez votre code de méthode Save. vous devez également ajouter le message à votre liste.

void SaveMessage() 
{ 

    this.MessageList.Add(this.Message); 
    //does excecution to database to save. 

} 
+0

j'obtiens une erreur de "Référence d'objet non définie à une instance d'un objet." quand j'ai ajouté ce que vous avez dans mon code. Dois-je instancier à nouveau la collection? – Calvin

+0

compris pourquoi, j'ai dû vérifier la liste get for null ... – Calvin

0

Ajouter un message à MessageList et OnPropertyChanged("MessageList") à la fonction SaveMessage() de viewmodel.

+1

Vous n'avez pas besoin de OnPropertyChanged, MessageList est une ObservableCollection. – Phil

+0

Oh oui, ce n'est pas obligatoire car MessageList est ObservableCollection. Il suffit d'ajouter un message à messagelist. –

+0

@Phil - Si je n'ajoute pas OnPropertyChanged, je ne vais rien afficher. – Calvin

Questions connexes