2015-05-21 89 views
1

我正在從事WPF項目。我有這樣一個類:WPF ItemsControl不刷新

public class Field 
{ 
    public ReservationDTO reservation { get; set; } 

    public DelegateCommand FieldChangeCommand { get; set; } 

    public bool Available { get; set; } 
} 

而且我有它的集合

public ObservableCollection<Field> Fields { get; set; } 

我的看法是這樣的

<ItemsControl ItemsSource="{Binding Fields}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid 
       Columns="{Binding Columns}" 
       Rows="{Binding Rows}" 
       /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Button Command="{Binding FieldChangeCommand}" CommandParameter="{Binding}" Content="{Binding reservation.Statusz}" FontSize="5" IsEnabled="{Binding Available}"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

這完全適用於第一次,當它負載。但是稍後我可能會修改一些Fields的值。例如:(視圖模型代碼的一部分)

Fields[SelectedIndex].reservation.Statusz = "Sold"; 
Fields[SelectedIndex].Available = false; 
OnPropertyChanged("Fields"); 
OnPropertyChanged("Available"); 

是確保字段在此之後得到更新,因爲在視圖(如文本框)等元素刷新。但視圖上的buttongrid不會使用Fields的新值更新。

有人可以告訴我爲什麼,以及如何解決這個問題?

+0

你implem請在您的ReservationDTO類中使用INotifyPropertyChanged。如果沒有,那麼UI將不會收到您的Statusz屬性已更改的通知。 – Bijington

+0

@Bijington我有這樣的ViewModelBase。 public abstract class ViewModelBase:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; 保護ViewModelBase(){} 保護虛擬無效OnPropertyChanged([CallerMemberName]字符串propertyName的= NULL){ 如果 (的PropertyChanged!= NULL){ 的PropertyChanged(這一點,新PropertyChangedEventArgs(propertyName的)); } } } –

+0

@Bijington如果我讓我的Field類派生自ViewModelBase就夠了嗎?因爲我不確定是否可以修改ReservationDTO類。 –

回答

2

您的按鈕的內容綁定到您的ReservationDTO類的Statusz屬性,這意味着需要實現INotifyPropertyChanged以便按鈕內容更改爲「已售出」。你可以理解你不想在你的DTO課上。

另外,調用OnPropertyChanged看我錯了(我假設你的視圖模型上有Fields屬性,並且是從ViewModelBase繼承的類?

你需要做類似如下(請注意:我還沒有添加任何空引用檢查您的_reservation場):

public class Field : INotifyPropertyChanged 
{ 
    private bool _available; 
    private ReservationDTO _reservation; 

    public string Statusz 
    { 
     get 
     { 
      return _reservation.Statusz; 
     } 
     set 
     { 
      if (_reservation.Statusz != value) 
      { 
       _reservation.Statusz = value; 

       OnPropertyChanged("Available"); 
      } 
     } 
    } 

    public DelegateCommand FieldChangeCommand { get; set; } 

    public bool Available 
    { 
     get 
     { 
      return _available; 
     } 
     set 
     { 
      if (_available != value) 
      { 
       _available = value; 

       OnPropertyChanged("Available"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var localHandler = this.PropertyChanged; 

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

,然後改變你的按鈕結合:

<Button Command="{Binding FieldChangeCommand}" CommandParameter="{Binding}" Content="{Binding Statusz}" FontSize="5" IsEnabled="{Binding Available}"/> 
+0

這看起來很不錯,我明白原因。雖然我有一個問題,那this.PropertyChanged給出了一個錯誤(不包含定義)。你能告訴如何解決這個問題嗎?也許我應該將Field類移出視圖模型? 類ReservationViewModel:ViewModelBase –

+0

對不起,我錯過了屬性更改事件處理程序聲明我已經加入到我的回答。您只需將以下內容添加到Field類中:public event PropertyChangedEventHandler PropertyChanged; – Bijington