简体   繁体   English

尝试在文本框WPF的ListView上显示内容

[英]Trying to displaying whats on listview on a textbox WPF

I have a WPF with a listview filled with names that are coming from a database. 我有一个带有列表视图的WPF,其中填充了来自数据库的名称。 On the listview(gridview) are 3 coloumns (Name, Age, Grade). 在listview(gridview)上有3个栏目(名称,年龄,等级)。 What I'm trying to do is when I select a person on the listview I want their information to display in textboxes. 我要做的是,当我在列表视图中选择一个人时,希望他们的信息显示在文本框中。 I'm not sure if its better to do it through code or XAML, but I can't figure it out. 我不确定通过代码或XAML是否更好,但我无法弄清楚。 Any help is appreciated. 任何帮助表示赞赏。

Heres what I have: 这是我所拥有的:

          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();

Heres the XAML: 继承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>

You should have a look at using the MVVM design pattern for a greater separation of concerns, which is going to make testing and reusing your codebase much easier. 您应该看看如何使用MVVM设计模式来实现更大的关注点分离,这将使测试和重用代码库变得更加容易。

In this instance, you can bind the values of the text boxes declaratively in XAML by binding the DataContext of a surrounding element (eg a Grid that surrounds your text boxes) to the SelectedItem of the ListView . 在这种情况下,您可以通过将周围元素(例如,围绕您的文本框的GridDataContext绑定到ListViewSelectedItem ,在XAML中以声明方式绑定文本框的值。

As already mentioned MVVM with Databinding is the way to go. 如前所述,带数据绑定的MVVM是必经之路。

Here is a small working MVVM type sample that may point you in the right direction. 这是一个可用的小型MVVM类型示例,可能会为您指明正确的方向。

Check out the video linked to in the 3rd paragraph to help you along :) MVVM - Jason Dollinger 查看第3段中链接到的视频,以帮助您:) MVVM-Jason Dollinger

And for more helpful WPF information check out WPFTutorial.net 有关WPF的更多有用信息,请查看WPFTutorial.net

MainWindow.xaml 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>

Person.cs 人.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 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; }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM