2013-05-28 63 views
0

我的MVVM應用程序有一個小問題。在視圖模型中執行一個函數並實時刷新視圖

我有一個viewmodel函數修改集合。此集合綁定到視圖以顯示數據網格。當用戶點擊一個按鈕時,該功能修改了該集合,但可能需要幾分鐘時間,並且視圖不刷新。

我的問題是我該如何執行此功能來實時刷新視圖?

在另一個程序中,我使用了調度程序,但它是在沒有綁定的視圖後面的代碼中。

感謝

編輯:

型號:

public class Composants : INotifyPropertyChanged 
{ 
    private string _nom; 

    public string Nom 
    { 
     get { return _nom; } 
     set { _nom = value; OnPropertyChanged("Nom"); } 
    } 

} 

視圖模型:

public class PageSynchroViewModel : INotifyPropertyChanged 
{ 
    public void SynchroniserComposants() 
    { 
     foreach (var comp in _selectedVersion.ListeComposants) 
     { 
      comp.Nom = ""; 
     } 
} 

視圖(我不把所有的代碼):

<Page x:Class="Centre_de_synchronisation.Vues.PageSynchro" 
    [...] 
    xmlns:app="clr-namespace:Centre_de_synchronisation.Classes" mc:Ignorable="d" 
    d:DesignHeight="531" d:DesignWidth="778" 
Title="PageSynchro" Background="{x:Null}"> 
<Canvas> 
    [...] 
    <DataGrid Name="GridComposants" Style="{StaticResource DatagridStyle}" ItemsSource="{Binding ListeComposants}" AutoGenerateColumns="False" Canvas.Left="12" Canvas.Top="201" Height="285" Width="754" > 
     <DataGrid.Columns> 
      <DataGridTextColumn 
     Header="Nom" 
     Binding="{Binding Nom}" 
     Width="150" 
       IsReadOnly="True"/> 
      [...] 
    </DataGrid> 
    <Button Name="BoutonSynchro" Style="{StaticResource MessageBoxButtonStyle}" Content="Synchroniser" Height="27" Width="107" Command="{Binding BoutonSynchro}" CommandParameter="GridComposants" Visibility="{Binding Etat, Converter={StaticResource VisibilityConverter}}"/> 
</Canvas> 

+0

幾分鐘*?你能發佈你的代碼嗎? –

+0

幾秒鐘,但用戶點擊「同步」按鈕時沒有任何信息。我在MainWindow上有一個小的加載指示器。當用戶點擊同步按鈕時,PageSynchroViewModel發送消息到MainWindow(使用mvvm指示燈)顯示加載指示器,但不顯示。 – user1069516

回答

2

嘗試使用ObservableCollection<T>而不是您現在使用的集合。

這會導致無論何時向集合添加或刪除項目時都會更新視圖。

只記得當與ObservableCollection交互調用調度否則你將得到線程訪問異常

這裏是我做了測試這個代碼。

XAML

<Window.Resources> 
    <loc:MyViewModel x:Key="ViewModel" /> 
</Window.Resources> 
<Canvas DataContext="{StaticResource ViewModel}"> 
    <DataGrid ItemsSource="{Binding Collection}" 
       Width="150" 
       Height="200"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Nom" 
           Binding="{Binding Nom}" 
           Width="150" 
           IsReadOnly="True" /> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Button Command="{Binding DoStuffCommand}" 
      Canvas.Bottom="0" 
      Canvas.Right="0">Stuff</Button> 
</Canvas> 

視圖模型

public class MyViewModel 
{ 
    public ObservableCollection<MyModel> Collection { get; set; } 

    public ICommand DoStuffCommand { get; set; } 

    public MyViewModel() 
    { 
     this.Collection = new ObservableCollection<MyModel>(); 

     for (int i = 0; i < 10; i++) 
     { 
      Collection.Add(new MyModel { Nom = i.ToString() }); 
     } 

     this.DoStuffCommand = new RelayCommand(DoStuff); 
    } 

    private void DoStuff() 
    { 
     foreach (var item in Collection) 
     { 
      item.Nom = item.Nom + "."; 
     } 
    } 
} 

模型

public class MyModel : INotifyPropertyChanged 
{ 
    private string nom; 

    public string Nom 
    { 
     get { return nom; } 
     set 
     { 
      nom = value; 
      RaiseChanged("Nom"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaiseChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

它更新在視圖中喃。

+0

我不添加或刪除項目,只是更改項目屬性,以及每個屬性調用propertyChanged事件。用於集合的模型實現INotifyPropertyChange – user1069516

+0

在處理結束時,嘗試調用帶有集合名稱的PropertyChanged事件,如果您在集合項上使用了'INotifyPropertyChanged',它們應該通過'ObservableCollection' – ywm

+0

應該在您的視圖模型中出現。雖然你可能希望用相關的代碼更新你的問題。它可能會吸引更多的答案。 – ywm