0

首先,如果这个问题没有完全合理的意义,我深表歉意——当谈到 C# 和 XAML 时,我是一个完全的新手。

我创建了这一类人:

class Student
{
    private string studentID;
    public string StudentID
    {
        get { return studentID; }
        set
        {
            studentID = value;
            NotifyPropertyChanged("StudentID");
        }
    }

    private string firstName;
    public string FirstName {
        get { return firstName; }
        set
        {
            firstName = value;
            NotifyPropertyChanged("FirstName");
        }
    }

    private string surname;
    public string Surname
    {
        get { return surname; }
        set
        {
            surname = value;
            NotifyPropertyChanged("Surname");
        }
    }

    private string group;
    public string Group
    {
        get { return group; }
        set
        {
            group = value;
            NotifyPropertyChanged("Group");
        }
    }

    private int cValue;
    public int CValue
    {
        get { return cValue; }
        set
        {
            cValue = value;
            NotifyPropertyChanged("CValue");
        }
    }

    private string teacher;
    public string Teacher
    {
        get { return teacher; }
        set
        {
            teacher = value;
            NotifyPropertyChanged("Teacher");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] string caller = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
        }
    }

    public Student() { }

    public Student(string studentID, string firstName, string surname, string group, int cValue, string teacher)
    {
        StudentID = studentID;
        FirstName = firstName;
        Surname = surname;
        Group = group;
        CValue = cValue;
        Teacher = teacher;
    }


    // strings used to create random students
    private static readonly string[] firstNames = { "Adam", "Bob", "Carl", "David", "Edgar", "Frank", "George", "Harry", "Isaac", "Jesse", "Ken", "Larry" };
    private static readonly string[] surnames = { "Adamson", "Bobson", "Carlson", "Davidson", "Edgarson", "Frankson", "Georgeson", "Harryson", "Isaacson", "Jesseson", "Kenson", "Larryson" };
    private static readonly string[] groups = { "6a", "5b" };
    private static readonly string[] teachers = { "Fred", "Jim"};

    // method to create random students
    public static IEnumerable<Student> CreateStudents(int count)
    {
        var people = new List<Student>();

        var r = new Random();

        for (int i=0; i< count; i++)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("A");
            builder.Append(i.ToString());
            string num = builder.ToString();
            var s = new Student()
            {
                StudentID = num,
                FirstName = firstNames[r.Next(firstNames.Length)],
                Surname = surnames[r.Next(surnames.Length)],
                Group = groups[r.Next(groups.Length)],
                Teacher = teachers[r.Next(teachers.Length)]
            };
            people.Add(s);
        }
        return people;
    }

}

然后,我创建了这些人员对象的列表,并且可以轻松地将这个列表绑定到列表/网格视图。

我想做的是在每个项目上都有一个加号和减号按钮,以从该人的 CValue 中添加或删除 1。(我会上传一张图片来演示,但我不会让我......)

我怎么能以像我这样的白痴也能理解的方式来布置 XAML 并为此添加绑定?

谢谢!

4

3 回答 3

0

正如您在此处看到的,PropertyChanged 事件是 INotifyPropertyChanged 的​​接口事件,所以我认为您的“学生”类需要显式实现此接口。

public class Student : INotifyPropertyChanged

也许这个实施指南可以帮助你。

于 2015-08-08T20:55:07.070 回答
0

您需要使用Observable Collection而不是List

那么您所要做的就是根据需要操作此列表,它会自动通知 UI 更改

于 2015-08-09T12:49:00.697 回答
0

您需要在学生 VM 上使用RelayCommandor 。DelegateCommand它们不是 WPF 的一部分,但都是直接在 VM 中调用委托的常用实现,ICommand并且在 MVVM 中广泛使用。然后,您可以将按钮Command直接绑定到它们:

class Student : INotifyPropertyChanged
{
    ICommand AddCommand    { get; private set; }
    ICommand RemoveCommand { get; private set; }

    public Student()
    {
        this.AddCommand = new RelayCommand(Add);
        this.RemoveCommand = new RelayCommand(Remove);
    }

    private Add()
    {
        this.CValue++;
    }

    private Remove()
    {
        this.CValue--;
    }

    //snip rest of Student properties
}

在您的 XAML 学生模板中:

<Button Command="{Binding AddCommand>" Content="Add"/>
<Button Command="{Binding RemoveCommand>" Content="Remove"/>

如果您希望让 Student 对象不受 VM 的影响(即它纯粹是一个模型类),那么您可以在父 VM 上实现相同的命令,但将 student 对象作为命令参数传递:

class StudentsVM: INotifyPropertyChanged
{
    ICommand AddCommand    { get; private set; }
    ICommand RemoveCommand { get; private set; }

    public StudentsVM()
    {
        this.AddCommand = new RelayCommand<Student>(Add);
        this.RemoveCommand = new RelayCommand<Student>(Remove);
    }

    private Add(Student student)
    {
        student.CValue++;
    }

    private Remove(Student student)
    {
        student.CValue--;
    }

    //snip rest of Student properties
}

在您的 XAML 学生模板中:

<Button Command="{Binding DataContext.AddCommand, ElementName=root}"
        CommandParameter="{Binding}"
        Content="Add"/>
<Button Command="{Binding DataContext.RemoveCommand, ElementName=root}" 
        CommandParameter="{Binding}"
        Content="Remove"/>

其中“root”是您的父视图。这只是在父视图中获取命令的一种方法,如果您愿意,可以使用 RelativeSource 代替。

于 2015-08-09T12:59:20.403 回答