2011-10-09 54 views
0

我有一个WPF与列表视图充满了来自数据库的名称。在列表视图(gridview)是3 coloumns(名称,年龄,年级)。我想要做的是当我在列表视图上选择一个人时,我想让他们的信息显示在文本框中。我不确定它是否更好地通过代码或XAML来完成,但我无法弄清楚。任何帮助表示赞赏。试图在文本框上显示在列表视图什么WPF

继承人我有:

  namespace Camp_ 
{ 
/// <summary> 
/// Interaction logic for CampersPage.xaml 
/// </summary> 
public partial class CampersPage : Page 
{ 
    MainWindow _parentForm; 

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


     for (int i = 0; i < _parentForm.allCampers.Count; i++) 
     { 


      listViewCampers.Items.Add(new { Name = "" + _parentForm.allCampers[i].getName(), Age = "" + _parentForm.allCampers[i].getAge(), Grade = "" + _parentForm.allCampers[i].getGrade() }); 

     } 
    } 


     private void listViewCampers_SelectionChanged(object sender, SelectionChangedEventArgs e) 

    { 
     for (int i = 0; i < _parentForm.allCampers.Count; i++) 
     { 


       // txtName.Text = listViewCampers.SelectedItem.Col1.toString(); 
      txtName.Text = "" + _parentForm.allCampers[i].getName(); 
       txtAge.Text = "" + _parentForm.allCampers[i].getAge(); 
       txtGrade.Text = "" + _parentForm.allCampers[i].getGrade(); 


     } 

     } 
    } 
    } 


     // _parentForm.ListToText(); 
      // for (int i = 0; i < _parentForm.testClass.g1.members.Count; i++) 
     /* 
      { 
       if (listViewCampers.SelectedItem == _parentForm.testClass.g1.members[i].getName()) 
       { 
        txtName.Text = _parentForm.testClass.g1.members[i].getName(); 
        txtAge.Text = "" + _parentForm.testClass.g1.members[i].getAge(); 
        txtGrade.Text = "" + _parentForm.testClass.g1.members[i].getGrade(); 
        txtRequest1.Text = "None"; 
        txtRequest2.Text = "None"; 
        txtRequest3.Text = "None"; 

        Camper[] x = _parentForm.testClass.g1.members[i].getRequests(); 

        if (x[0] != null && x[1] != null && x[2] != null) 
        { 
         txtRequest1.Text = "" + x[0].getName(); 
         txtRequest2.Text = "" + x[1].getName(); 
         txtRequest3.Text = "" + x[2].getName(); 
      } } } 
    */ 

     //txtName.Text = listViewCampers.SelectedItem.Col1.toString(); 
     //txtAge.Text = "" + _parentForm.allCampers[i].getAge(); 
     //txtGrade.Text = "" + _parentForm.allCampers[i].getGrade(); 

继承人的XAML:

 <Page x:Class="Camp_.CampersPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="570" 
Title="Campers Page" ShowsNavigationUI="False" xmlns:my="clr-namespace:Camp_" > 

<Grid Name="camperGrid"> 
    <Grid.Background> 
     <RadialGradientBrush> 
      <GradientStop Color="#FFC3D6F5" Offset="0" /> 
      <GradientStop Color="#FFEFF5FF" Offset="1" /> 
     </RadialGradientBrush> 
    </Grid.Background> 





     <ListView HorizontalAlignment="Left" Margin="10,10,0,40" Name="listViewCampers" Width="200" SelectionChanged="listViewCampers_SelectionChanged"> 

      <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 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" /> 
      <Label Content="Age" Height="28" HorizontalAlignment="Left" Margin="23,75,0,0" Name="lblAge" VerticalAlignment="Top" /> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="23,27,0,0" Name="txtGrade" VerticalAlignment="Top" Width="120" Grid.Row="1" /> 
      <Label Content="Grade" Height="28" HorizontalAlignment="Left" Margin="23,0,0,0" Name="lblGrade" VerticalAlignment="Top" Grid.Row="1" /> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="180,46,0,0" Name="txtRequest1" VerticalAlignment="Top" Width="120" /> 
      <Label Content="Roommate Request #1" Height="28" HorizontalAlignment="Left" Margin="180,24,0,0" Name="lblRequest" VerticalAlignment="Top" /> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="180,103,0,0" Name="txtRequest2" VerticalAlignment="Top" Width="120" /> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="180,27,0,0" Name="txtRequest3" VerticalAlignment="Top" Width="120" Grid.Row="1" /> 
      <Label Content="Roommate Request #2" Height="28" HorizontalAlignment="Left" Margin="180,75,0,0" Name="label1" VerticalAlignment="Top" /> 
      <Label Content="Roommate Request #3" Height="28" HorizontalAlignment="Left" Margin="180,0,0,0" Name="label2" VerticalAlignment="Top" Grid.Row="1" /> 
     </Grid> 

</Grid> 

回答

0

你应该看看使用MVVM design pattern为关注更大的分离,这是怎么回事使测试和重用您的代码库变得更容易。

在这种情况下,你可以通过结合周围元件的DataContext绑定声明在XAML的文本框中的值(例如Grid围绕文本框)到ListViewSelectedItem

+0

感谢您的回复。我明白你的意思,但我从来没有做过任何这样的事情,所以老实说,我不知道如何设置绑定和设置它。我看例子,他们只会说文本=“{绑定名称}”更多的它,但我不知道什么 – TMan

+0

我会开始阅读关于数据绑定的MSDN文档 - http://msdn.microsoft.com /en-us/library/ms750612.aspx。然后,当你对此有所了解的时候,你可以在我所包含的链接上阅读MVVM设计。在MVVM中,视图的DataContext(即您的XAML UserControl或Window)将是您的视图模型的一个实例,因此当您有绑定语句时{绑定名称}通常绑定到视图模型的公共属性。一旦你了解了MVVM,我会考虑使用MVVM框架来简化开发。 – devdigital

0

正如已经提到的MVVM with Databinding是要走的路。

这是一个小型的MVVM类型示例,可能会指向您正确的方向。

退房在第3段连接到视频能帮助你走好:) MVVM - Jason Dollinger

而对于更多有用的信息WPF退房WPFTutorial.net

MainWindow.xaml

<Window x:Class="WpfBindingSample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:models="clr-namespace:WpfBindingSample.Models" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <ListBox Grid.Column="0" SelectedValue="{Binding Path=SelectedPerson, Mode=TwoWay}" ItemsSource="{Binding People}"> 
      <ListBox.Resources> 
       <DataTemplate DataType="{x:Type models:Person}" > 
        <StackPanel> 
         <TextBlock Text="{Binding FirstName}" /> 
         <TextBlock Text="{Binding LastName}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.Resources> 
     </ListBox> 
     <StackPanel Grid.Column="1" DataContext="{Binding SelectedPerson}"> 
      <TextBlock Text="{Binding FirstName}" /> 
      <TextBlock Text="{Binding LastName}" /> 
     </StackPanel> 
    </Grid> 
</Window> 

人。 cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 

namespace WpfBindingSample.Models 
{ 
    public class Person : DependencyObject 
    { 


     public string FirstName 
     { 
      get { return (string)GetValue(FirstNameProperty); } 
      set { SetValue(FirstNameProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for FirstName. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty FirstNameProperty = 
      DependencyProperty.Register("FirstName", typeof(string), typeof(Person), new UIPropertyMetadata("")); 



     public string LastName 
     { 
      get { return (string)GetValue(LastNameProperty); } 
      set { SetValue(LastNameProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for LastName. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty LastNameProperty = 
      DependencyProperty.Register("LastName", typeof(string), typeof(Person), new UIPropertyMetadata("")); 



    } 
} 

MainWindowViewModel.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Collections.ObjectModel; 
using WpfBindingSample.Models; 

namespace WpfBindingSample 
{ 
    public class MainWindowViewModel : DependencyObject 
    { 
     public MainWindowViewModel() 
     { 
      People = new System.Collections.ObjectModel.ObservableCollection<Person>(); 
     } 

     public Person SelectedPerson 
     { 
      get { return (Person)GetValue(SelectedPersonProperty); } 
      set { SetValue(SelectedPersonProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for SelectedPerson. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty SelectedPersonProperty = 
      DependencyProperty.Register("SelectedPerson", typeof(Person), typeof(MainWindowViewModel), new UIPropertyMetadata(null)); 

     public ObservableCollection<Person> People { get; set; } 
    } 
}