我有一个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>
答案 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();
}
}