2011-10-10 88 views
3

我知道这个问题可能听起来类似于我的最后一个,但这是从别人的建议采取不同的方法。走一条不同的路线,我试图将listview中的whats绑定到几个文本框。我对WPF非常陌生,不知道我是否做得对。我想这是一个MVVP方法。目前该计划没有多大作用。在列表视图中有一个项目,但它是空的(没有名字,年龄,等级)。当我尝试在列表视图上选择它时,我可以看到它突出显示的项目b/c。任何帮助是极大的赞赏。使用ObservableCollection和绑定WPF

有一个类可以创建一个字符串名称,int age,int grade并且​​具有getter和setter方法。类的名称叫做坎珀(年龄,年级,姓名)

类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" /> 
+0

请给我们看看'露营'类 – SLaks

+0

好吧,我编辑它。 :) – TMan

+0

如果您不熟悉数据绑定,请阅读[概述](http://msdn.microsoft.com/zh-cn/library/ms752347.aspx)... –

回答

4

你需要在你的viewmodel中创建公共属性来绑定。

你不应该在.Net中制作getSomething()方法。

0

对于这个代码在你的ListView声明:

DisplayMemberPath="name" 

您正在使用的字段名称,而不是财产。我认为即使数据绑定是公开的(说实话,我从来不明白为什么会是这种情况),数据绑定并不适用于域名。

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

编辑:正如SLaks指出的那样(我没有注意到这点,直到他指出),您正在使用方法作为属性。我认为他们需要与getter实际.net属性,例如:

public string Name 
{ 
    get { return _name; } 
} 
相关问题