![](/img/trans.png)
[英]Comobox and TextBox not displaying properly in ListView WPF C#
[英]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設計模式來實現更大的關注點分離,這將使測試和重用代碼庫變得更加容易。
在這種情況下,您可以通過將周圍元素(例如,圍繞您的文本框的Grid
的DataContext
綁定到ListView
的SelectedItem
,在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.