簡體   English   中英

嘗試在文本框WPF的ListView上顯示內容

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

我有一個帶有列表視圖的WPF,其中填充了來自數據庫的名稱。 在listview(gridview)上有3個欄目(名稱,年齡,等級)。 我要做的是,當我在列表視圖中選擇一個人時,希望他們的信息顯示在文本框中。 我不確定通過代碼或XAML是否更好,但我無法弄清楚。 任何幫助表示贊賞。

這是我所擁有的:

          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>

您應該看看如何使用MVVM設計模式來實現更大的關注點分離,這將使測試和重用代碼庫變得更加容易。

在這種情況下,您可以通過將周圍元素(例如,圍繞您的文本框的GridDataContext綁定到ListViewSelectedItem ,在XAML中以聲明方式綁定文本框的值。

如前所述,帶數據綁定的MVVM是必經之路。

這是一個可用的小型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; }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM