2015-05-21 90 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