none
WPF数据绑定与获取 RRS feed

  • 问题

  • 在wpf界面中为了显示数据方便,我将界面上的TextBox都绑定到了一个类的某些属性上,例如,我有个Student类,
    class Student
    {
    public string Name;
    public string No;
    public string CnScore;
    public string EnScore;
    public string MathScore;
    }
    界面上的几个编辑框,用于显示数据:
    <Grid Name="girdMain">
    <TextBox x:Name="txtName" Text="{Binding Path=Name}">                   
    <TextBox x:Name="txtNo" Text="{Binding Path=No}">
    <TextBox x:Name="txtCnScore" Text="{Binding Path=CnScore}">
    <TextBox x:Name="txtEnScore" Text="{Binding Path=EnScore}">
    <TextBox x:Name="txtMathScore" Text="{Binding Path=MathScore}">
    </Grid>

    程序的处理:当程序中查询到每个student时,将student传给Grid.DataContext,这样界面中的TextBox就会根据绑定路径显示数据;
     如:Student student=GetStudentFormDB();
    girdMain.DataContext=student;
    这样显示数据确实很方便,但是,如果我要反向的通过TextBox获取数据貌似还是像以前没有绑定那样一样麻烦,
    如果先给Grid.DataContext赋值绑定了数据,
    那可以使用Student stu=(Student)girdMain.DataContext;这样获取修改后的数据,但是如果事先没有进行这步:Student student=GetStudentFormDB();
    girdMain.DataContext=student;
    然后Student stu=(Student)girdMain.DataContext;是获取不到数据的,那这样获取数据是不是只能通过最原始的办法,一个TextBox一个TextBox的获取数据,然后再组装类呢?
    既然WPF数据绑定显示数据都这么方便,那获取数据应该也有更方便的处理方法吧?请问这里有没有比较好的处理方法?请指教


    • 已编辑 blwuer 2013年1月21日 6:02 修改错别字
    2013年1月21日 6:01

答案

  • 这个在WPF中不建议你通过“Student stu=(Student)girdMain.DataContext”去获取数据,WPF数据和UI是分离的, 你要想操作数据,比如获取数据, 你应该直接去获取数据源,比如student对象,然后用Twoway绑定,这样你student对象的值也就是UI上显示的值,他们是同步的,你改变UI,数据源student也会变更。你改变student数据源,UI也会更新。


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月22日 6:21
    版主

全部回复

  • 这个在WPF中不建议你通过“Student stu=(Student)girdMain.DataContext”去获取数据,WPF数据和UI是分离的, 你要想操作数据,比如获取数据, 你应该直接去获取数据源,比如student对象,然后用Twoway绑定,这样你student对象的值也就是UI上显示的值,他们是同步的,你改变UI,数据源student也会变更。你改变student数据源,UI也会更新。


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月22日 6:21
    版主
  • 反向是可以的,点击按钮是查看spStudent.DataContext进行查看。见示例:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:loc="clr-namespace:WpfApplication1"
            x:Name="window"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel x:Name="spStudent">
            <TextBox Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
            <TextBox Text="{Binding Age,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
            <Button Content="Next Student" Click="Button_Click" />
            <ListBox ItemsSource="{Binding Students,ElementName=window}">
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="loc:Student">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Name}" />
                            <TextBlock Text=" - " />
                            <TextBlock Text="{Binding Age}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>
    </Window>
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    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.ObjectModel;
    
    namespace WpfApplication1 {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window {
    
            public ObservableCollection<Student> Students { get; set; }
    
            public MainWindow() {
                Students = new ObservableCollection<Student>();
                Student stu = Student.GetStudent();
                Students.Add(stu);
    
                InitializeComponent();            
    
                spStudent.DataContext = stu;
            }
    
            private void Button_Click(object sender, RoutedEventArgs e) {
                Student stu = Student.GetStudent();
                spStudent.DataContext = stu;
                Students.Add(stu);
            }
        }
    
        public class Student {
            private string _name;
    
            public string Name {
                get { return _name; }
                set { _name = value;  }
            }
    
            private int _age;
    
            public int Age {
                get { return _age; }
                set { _age = value; }
            }
            
    
            public static Student GetStudent() {
                Student stu = new Student {
                    Name="Name "+DateTime.Now.ToString("MMss"),
                    Age=int.Parse(DateTime.Now.ToString("MMss"))
                };
                return stu;
            }
        }
    }
    
    做法不是很规范,只用于示例。

    Sonny.Lin

    2013年1月31日 3:03