使用ObservableCollection和绑定WPF

3

我知道这个问题听起来和我上一个问题很相似,但这是从别人的建议中采取的不同方法。我正在尝试将列表视图中的内容绑定到几个文本框中。我对WPF非常陌生,也不确定我是否做得对。我想这是MVVP方法。现在程序没有做什么。列表视图中有一项,但它是空的(没有名称、年龄、成绩)。当我尝试在列表视图中选择它时,我可以看到这个项目因为它会被突出显示。非常感谢任何帮助。

有一个类,里面包含了一个字符串名称,int型年龄和int型等级,还有getter和setter方法。类的名称叫做Camper(age, grade, name)。

BindingCamper类:制作ObservableCollection

     public class Camper
 {
public Camper[] requests;
public int[] relationValues;
public String name;
private String school;
public int age;
public int grade;
private Boolean isGrouped = false;
private string group;


      public Camper(int a, int g, String n)
{
    requests = new Camper[4];
    relationValues = new int[4];
    name = n;
    this.age = a;
    this.grade = g;
}

public Camper(String n)
{
    this.requests = new Camper[4];
    this.relationValues = new int[4];
    this.name = n;
}

public Camper()
{

}

// Getter Methods
public string getName()
{
    return name.ToString();
}
public string getSchool()
{
    return this.school;
}
public int getAge()
{
    return this.age;
}
public int getGrade()
{
    return this.grade;
}
public int getRelationValue(int i)
{
    if (i < relationValues.Length)
    {
        return relationValues[i];
    }
    else
    {
        return 0;
    }

}

class BindingCamper
{
    public ObservableCollection<Camper> Campers { get; private set; }

    public BindingCamper()
    {
        Campers = new ObservableCollection<Camper>();

    }

另一个类(页面):

public partial class CampersPage : Page
{
    MainWindow _parentForm;

    public ObservableCollection<Camper> Campers { get; private set; }

    public CampersPage(MainWindow parent)
    {
        _parentForm = parent;
        InitializeComponent();

       // Campers = new ObservableCollection<Camper>();
        var bindMe = new BindingCamper();
        Camper CampMe = new Camper(3, 4, "Tony Lagarrigue");
        // CampMe.getName();
        bindMe.Campers.Add(CampMe);
        DataContext = bindMe;

使用XAML绑定一切。
      <ListView HorizontalAlignment="Left" Margin="10,10,0,40" x:Name ="listViewCampers" Width="200" SelectionChanged="listViewCampers_SelectionChanged" ItemsSource="{Binding Campers}" DisplayMemberPath="name" IsSynchronizedWithCurrentItem="{x:Null}">

            <ListView.View>
                <GridView>



                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="100"  />
                    <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="40" />
                    <GridViewColumn Header="Grade" DisplayMemberBinding="{Binding Grade}" Width="40" />

                </GridView>
            </ListView.View>
        </ListView>
        <Grid Height="Auto" HorizontalAlignment="Stretch" Margin="209,12,0,0" Name="infoGrid" VerticalAlignment="Stretch">
            <Grid.RowDefinitions>
                <RowDefinition Height="134*" />
                <RowDefinition Height="154*" />
            </Grid.RowDefinitions>
            <Label Content="Name" Height="28" HorizontalAlignment="Left" Margin="23,24,0,0" Name="lblName" VerticalAlignment="Top" />
        <TextBox Text="{Binding name, ElementName=listViewCampers}" Height="23" HorizontalAlignment="Left" Margin="23,46,0,0" Name="txtName" VerticalAlignment="Top" Width="120" AcceptsReturn="True" />
            <TextBox Height="23" HorizontalAlignment="Left" Margin="23,103,0,0" Name="txtAge" VerticalAlignment="Top" Width="120" />

请展示 Camper 类。 - SLaks
如果您是数据绑定的新手,请阅读概述 - H.B.
2个回答

4

您需要在您的视图模型中创建公共属性进行绑定。

在.NET中,不应该创建getSomething()方法。


1

对于你的 ListView 声明中的这段代码:

DisplayMemberPath="name"

你正在使用字段名称而不是属性。我认为数据绑定不适用于字段,即使它们是公共的(说实话,我从来没有理解为什么会这样)。

看起来你在其他几个地方也这样做了--确保你绑定到属性,并确保名称正确(它是区分大小写的)。

编辑:正如SLaks所指出的(直到他指出我才注意到),你正在将方法用作属性。我认为它们需要是真正的.NET属性,具有getter,例如:

public string Name
{
  get { return _name; }
}

你刚刚回答了我一个困扰我(和我的代码)数小时的问题!只需在我的类中将 { get; set; } 添加到 >public string Name<,就可以将它们作为 ListView 的 DisplayMemberPath 显示。 - Viktor Katzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接