环境:Win7x64、vs2017
参考网址:
WPF入门教程系列二十一——DataGrid示例(一) - DotNet菜园 - 博客园.html(https://www.cnblogs.com/chillsrc/p/4881724.html)
WPF入门教程系列二十二——DataGrid示例(二) - DotNet菜园 - 博客园.html(https://www.cnblogs.com/chillsrc/p/4898061.html)
1、运行起来的界面样子:
2、界面源码:(ZC:这个 看个大概吧,可能不全,但是 DataGrid部分应该是全的)
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfUI_01" xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic" x:Class="WpfUI_01.MainWindow" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid x:Name="datagridTest1" HorizontalAlignment="Left" Height="363" Margin="195,10,0,0" VerticalAlignment="Top" Width="587" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding strTC0}" ClipboardContentBinding="{x:Null}" Header="TextColumn0"/> <DataGridTextColumn Binding="{Binding strTC1}" ClipboardContentBinding="{x:Null}" Header="TC1"/> <DataGridTextColumn Binding="{Binding strTC2}" ClipboardContentBinding="{x:Null}" Header="TC2"/> <DataGridTextColumn Binding="{Binding strTC3}" ClipboardContentBinding="{x:Null}" Header="TC3"/> <DataGridTextColumn Binding="{Binding strTC4}" ClipboardContentBinding="{x:Null}" Header="TC4"/> <DataGridComboBoxColumn x:Name="datagrid_comboboxcolumn" ClipboardContentBinding="{x:Null}" Header="ComboboxColumn" SelectedValueBinding="{Binding Path=strTC2, UpdateSourceTrigger=PropertyChanged}" SelectedItemBinding="{x:Null}" SelectedValuePath="strCC2" DisplayMemberPath="strCC1"/> </DataGrid.Columns> <!--TextBinding="{Binding strCC1}" 这也是“DataGrid.Columns”的一个属性--> </DataGrid> <Button x:Name="btnUpdate" Content="Update" HorizontalAlignment="Left" Margin="10,196,0,0" VerticalAlignment="Top" Width="75"/> <Button x:Name="btnRefresh" Content="Refresh" HorizontalAlignment="Left" Margin="10,221.686,0,0" VerticalAlignment="Top" Width="75" Click="BtnRefresh_Click"/> </Grid> </Window>
ZC:在设置 DataGrid的属性SelectedValueBinding 的时候,vs的“输出”界面 一直报错 我是这样设置的:“SelectedValueBinding="{Binding Path=strCC2, UpdateSourceTrigger=PropertyChanged}"”,实际上 这里的 Binding 是指 绑定 别的列 ! ! !... 改成 strTC2(即 列"TC2") 就OK了。 ZC:这是在做 关联:列"TC2" 的值 与 列"ComboboxColumn"中的属性"SelectedValuePath"的值 关联起来。
ZC:这个 弄了一下午,怎么也想不到 "ComboboxColumn"的"SelectedValueBinding"属性 是在和别的列做 Binding !!!...(其实 也不能理解成别的列,假如 strTC2 没有相关的列显示的话 应该照样是可以 绑定的)
3、代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Collections; using System.Collections.ObjectModel; namespace WpfUI_01 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } public struct TextColumn { // ZC: 这里 一定要写成“{ get; set; }”的形式,写成“public string strTC0;”的话,DataGrid就会找不到成员...!!! // ZC: 用了“{ get; set; }” 的话,就只能 new 出来用了? public string strTC0 { get; set; } public string strTC1 { get; set; } public string strTC2 { get; set; } public string strTC3 { get; set; } public string strTC4 { get; set; } }; public struct ComboboxColumn { public string strCC0 { get; set; } public string strCC1 { get; set; } public string strCC2 { get; set; } }; //ObservableCollection<TextColumn> FlistTC = new ObservableCollection<TextColumn>(); List<TextColumn> FlistTC = new List<TextColumn>(); List<ComboboxColumn> FlistCC = new List<ComboboxColumn>(); private void BtnRefresh_Click(object sender, RoutedEventArgs e) { ComboboxColumn cbc = new ComboboxColumn(); for (int i = 0; i < 5; i++) { cbc.strCC0 = "cc0_" + i; cbc.strCC1 = "cc1_" + i; cbc.strCC2 = "tc2_" + i; FlistCC.Add(cbc); } datagrid_comboboxcolumn.ItemsSource = FlistCC; // {Binding Path=strCC0,UpdateSourceTrigger=PropertyChanged} // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** //MessageBox.Show("A"); TextColumn tc = new TextColumn(); for (int i = 0; i < 5; i++) { tc.strTC0 = "tc0_" + i; tc.strTC1 = "tc1_" + i; tc.strTC2 = "tc2_" + i; tc.strTC3 = "tc3_" + i; tc.strTC4 = "tc4_" + i; FlistTC.Add(tc); } datagridTest1.ItemsSource = FlistTC; //datagridTest1.DataContext = FlistTC; //for (int i = 0; i < FlistTC.ToArray().Length; i++) //{ // Console.WriteLine(FlistTC.ElementAt<TextColumn>(i).strTC0); //} } } }
3.1、
ZC:从上面的图 应该可以看出 属性"DisplayMemberPath" 指明的就是 用哪个成员变量的信息来显示(别的 成员信息 不用于显示,用于 Binding等 别的用处)。
ZC:如果 想用 strCC0 + strCC1 的值 来用于显示的话 怎么配置? 如果想用 strCC0 + strCC1 来用于Binding的话 又该怎么配置??
4、
5、