如何隐藏ItemsControl中的最后一个子控件

时间:2018-03-21 15:17:27

标签: c# wpf mvvm

我有一个ItemsControl,它的ItemsSource使用了ObservableCollection。

ObservableCollection持有学生类型。

ObservableCollection是在我的ViewModel中使用此方法构建的:

private void AddStudentToCollection()
{
  List<ClassMates> classMates = new List<ClassMates>();
  classMates.Add(SelectedClassMate);
  Student = new Student(classMates); // Setting the VM property here
  Id = Student.ID; // Setting the VM property here
  StudentCollection.Add(Student);
 }
}

以下是视图模型中的关联属性:

private Student student;
public Student Student
{
 get
 {
  return this.student;
 }
 set
 {
  this.student = value;
  OnPropertyChanged("Student");
  }
 }

 private int id;
 public int ID
 {
   get
   {
     return this.id;
   }
   set
   {
    this.id = value;
    OnPropertyChanged("ID");
    }
   }

private ObservableCollection<Student> studentCollection;
public ObservableCollection<Student> StudentCollection
{
 get
 {
  if (studentCollection == null)
    studentCollection = new ObservableCollection<Student>();
  return this.studentCollection;
 }
}

这是我的学生班:

public class Student : INotifyPropertyChanged
{
 public Student(List<ClassMates> ClassMates)
 {
  this.ClassMates = ClassMates;
 }

 public IList<ClassMates> ClassMates { get; set; }

 private int id;
 public int ID
 {
  get
  {
    return this.id;
  }
  set
  {
   this.id = value;
   OnPropertyChanged("ID");
  }
 }

每次用户从Grid中选择一行时,都会调用此AddStudentToCollection()方法。将添加的学生是实际选定的行。

ItemsControl包含Grid控件,Grid控件将如下所示:

[------] 1

[------] 1

[------] 1

这里的1是视图模型中的ID属性。

网格将包含更多信息,但这是基本布局。随着ObservableCollection的增长,ItemsControl将会增长。

我想要完成的任务:

如果Grid是ItemsControl的最后一个元素,我想隐藏最后一个ID属性(最后一个)。

所以我真的希望上面的例子为

[----] 1

[----] 1

[----]

现在,我很清楚,在我的项目的View Model中有一个属性更合理,而且在Student Class中没有单独的属性。

我想知道是否有一种干净的MVVM方式来实现这一目标。 这是我的XAML:

<ItemsControl ItemsSource="{Binding StudentCollection}">
  <ItemsControl.ItemTemplate>
   <DataTemplate>
    <Grid>
     <Grid.ColumnDefinitions>
      <ColumnDefinition Width="100"/>
      <ColumnDefinition Width="*"/>
     </Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
      <RowDefinition Height="70"/>
      <RowDefinition Height="*"/>
     </Grid.RowDefinitions>
     <Label Grid.Row="1" Grid.Column="1"
      // This is the text of the Label, where the ID is actually displayed.
      Content="{Binding Path=DataContext.ID, RelativeSource={RelativeSource AncestorType=ItemsControl}, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
   </DataTemplate>
  </ItemsControl.ItemTemplate>
 </ItemsControl>

1 个答案:

答案 0 :(得分:0)

如果您不想向返回Student的{​​{1}}类添加属性,则可以在视图中使用多转换器,将当前项的索引与总数进行比较bool中显示的项目数:

ItemsControl

<强> XAML:

class MultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        ItemsControl ic = (ItemsControl)values[0];
        object item = values[1];

        return ic.Items.IndexOf(item) == ic.Items.Count - 1 ? Visibility.Collapsed : Visibility.Visible;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}