【问题标题】:Trying to displaying whats on listview on a textbox WPF试图在文本框 WPF 上的 listview 上显示什么
【发布时间】:2011-10-09 21:27:49
【问题描述】:

我有一个带有列表视图的 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>

【问题讨论】:

    标签: c# .net wpf visual-studio listview


    【解决方案1】:

    您应该看看使用MVVM design pattern 来更好地分离关注点,这将使您的代码库的测试和重用变得更加容易。

    在这种情况下,您可以在 XAML 中以声明方式绑定文本框的值,方法是将周围元素的 DataContext(例如,围绕文本框的 Grid)绑定到 @987654326 的 SelectedItem @。

    【讨论】:

    • 感谢您的回复。我明白你的意思,但我以前从未做过任何此类事情,所以老实说,我不确定如何设置绑定以及将其设置为什么。我看示例,他们只会说 Text = "{Binding Name}" 还有更多内容,但我不知道是什么
    • 我将首先阅读有关数据绑定的 MSDN 文档 - msdn.microsoft.com/en-us/library/ms750612.aspx。然后,当您对此有所了解时,您可以在我包含的链接中阅读有关 MVVM 设计的信息。在 MVVM 中,视图的 DataContext(即您的 XAML 用户控件或窗口)将是您的视图模型的一个实例,因此当您有绑定语句时,例如{Binding Name} 您通常绑定到视图模型的公共属性。一旦你了解了 MVVM,我会考虑使用 MVVM 框架来简化开发。
    【解决方案2】:

    正如已经提到的带有数据绑定的 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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 2011-01-08
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多