Использование ObservableCollection и Binding WPF - PullRequest
3 голосов
/ 10 октября 2011

Я знаю, что этот вопрос может звучать похоже на мой последний, но это другой подход, основанный на советах других. Идя другим путем, я пытаюсь связать что-то в виде списка с парой текстовых полей. Я чрезвычайно новичок в WPF и не уверен, правильно ли я это делаю. Я думаю, что это подход MVVP. Прямо сейчас программа не делает много. В списке есть один элемент, но он пустой (без имени, возраста, класса). Я вижу элемент b / c, который он выделяет при попытке выбрать его в списке. Любая помощь очень ценится.

Существует класс, который создает строковое имя, int age, int grade и имеет методы getter и setter. Название класса называется Camper (возраст, класс, имя)

Класс BindingCamper: создание наблюдаемой коллекции

     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" />

Ответы [ 2 ]

4 голосов
/ 10 октября 2011

Вам необходимо создать общедоступные свойства в вашей модели представления для привязки.

Вы никогда не должны делать getSomething() методы в .Net.

0 голосов
/ 10 октября 2011

Для этого кода в объявлении ListView:

DisplayMemberPath="name"

вы используете имя поля вместо свойства. Я не думаю, что привязка данных работает против полей, даже если они общедоступны (честно говоря, я никогда не понимал, почему это так).

Похоже, что вы делаете это и в нескольких других местах - убедитесь, что вы привязываетесь к свойству, и убедитесь, что имя правильное (это регистр).

Редактировать : как заметил SLaks (я не заметил этого, пока он не указал на это), вы используете методы в качестве свойств. Я думаю, что они должны быть фактическими свойствами .Net с геттерами, например ::

public string Name
{
  get { return _name; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...