WPF DataGrid有关问题

rengu4269 2018-05-08 03:27:50

如图所示,我是通过ObservableCollection绑定的DataGrid,我现在想要实现点击“平差计算”按钮,会将计算结果放在“高差改正数”这一列。
xaml语言如下
<DataGrid AutoGenerateColumns="False" RowHeaderWidth="20" FontSize="12"   x:Name="DataGrid4" RowBackground="AliceBlue" AlternatingRowBackground="White" RowHeight="25" HorizontalGridLinesBrush="Green" VerticalGridLinesBrush="Green" Grid.Column="1" HorizontalAlignment="Left" Height="199" Margin="57.8,61,0,0" VerticalAlignment="Top" Width="532">
<DataGrid.Columns>
<DataGridTextColumn Header="测段起点" Width="70" Binding="{Binding 测段起点, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></DataGridTextColumn>
<DataGridTextColumn Header="测段终点" Width="85" Binding="{Binding 测段终点,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTextColumn Header="测段长度(m)" Width="85" Binding="{Binding 测段长度,Mode=TwoWay ,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTextColumn Header="测站个数" Width="85" Binding="{Binding 测站个数,Mode=TwoWay , UpdateSourceTrigger=PropertyChanged}" ></DataGridTextColumn>
<DataGridTextColumn Header="观测高差(m)" Width="85" Binding="{Binding 观测高差, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTextColumn Header=" 高差改正数(m)" Width="100" Binding="{Binding correctionheiht,Mode=TwoWay ,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>

数据获取后表格正常显示
但点击平差计算
后就出现这种情况
我的后台绑定代码如下: public class getDatas : ObservableCollection<getData> { }
public struct getData
{
public string 测段起点
{
get;
set;
}
public string 测段终点
{
get;
set;
}
public string 测段长度
{
get;
set;
}
public string 测站个数
{
get;
set;
}
public string 观测高差
{
get;
set;
}
public string 高差改正数
{
get;
set;
}
// public string correctionheiht { get; set; }

}
平差计算里面的代码如下
 private void Button_Click_2(object sender, RoutedEventArgs e)
{





CaResult caResult = new CaResult();

double[] result = caResult._correction(dispersion, K_heihht, length);

for (int i = 0; i < 5; i++)
{
ps3.correctionheiht = Convert.ToString(result[i]);
infolist2.Add(ps3);


}
DataGrid4.ItemsSource = infolist1;





}

  getDatas infolist1 = new getDatas();
getData ps2 = new getData();


如正确将结果显示在“高差改正数”这一列,
求大神指点必有重谢。
...全文
633 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
stjisu 2018-05-14
  • 打赏
  • 举报
回复
特意做了个示例: 简单设定一个person,有编号,有姓名,有年龄

public class Person : INotifyPropertyChanged
    {
        public int ID { set; get; }
        public string Name { set; get; }
        public int Birthday { set; get; }
        private int age;
       
        //注意这里特意追加了 OnPropertyChanged事件属性。
        public int Age
        {
            get { return age; }
            set
            {
                if (age != value)
                {
                    age = value;
                    OnPropertyChanged("Age");
                }
            }
        }

        #region INotifyPropertyChanged Members

        /// <summary>
        /// INotifyPropertyChanged requires a property called PropertyChanged.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Fires the event for the property when it changes.
        /// </summary>
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
然后主程里的代码是:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //初始化人名列表
            getPeopleData();
            //绑定数据源
            DataGrid_List.ItemsSource = People;
        }
        //这句意思是先在内存中占个位。
        public List<Person> People = new List<Person>();
        
        //按钮触发方法
        private void button_Click(object sender, RoutedEventArgs e)
        {
            var p_q = People.SingleOrDefault(o => o.ID == 1);
            if (p_q != null)
            {
                //这里改变了的值并没能在DataGrid 中体现。
                p_q.Name = "张良";
                //这里改变了的值会在DataGrid 中体现。为什么?不理解就再去看一下Person里的属性。
                p_q.Age = 100;
            }

        }
        //初始人物列表
        private void getPeopleData()
        {
            Person p1 = new Person();
            p1.ID = 1;
            p1.Name = "张学友";
            p1.Birthday = 1961;

            People.Add(p1);

            Person p2 = new Person();
            p2.ID = 2;
            p2.Name = "张柏芝";
            p2.Birthday = 1980;

            People.Add(p2);

            Person p3 = new Person();
            p3.ID = 3;
            p3.Name = "张家辉";
            p3.Birthday = 1967;

            People.Add(p3);
            DateTime dt = DateTime.Now; 
            foreach(var p in People)
            {
                //计算年龄,给列表项重新赋值
                p.Age = dt.Year - p.Birthday;
            }
            
        }
    }
自我觉得这个示例应该能够很完美地解决你这个贴的疑问。
stjisu 2018-05-14
  • 打赏
  • 举报
回复
你for循环后Add() 的,已经是一个一个新的 ps3实例了。只不过每个新的ps3实例只有.correctionheiht属性被赋过值,其它属性并未赋值,即全都是空值。其实 你完全可以在生成infolist1列表的每个ps3列时,用函数方法给correctionheiht赋值。根本不用用到“平差计算”按钮来手动点。
stjisu 2018-05-14
  • 打赏
  • 举报
回复
你for循环后Add() 的,已经是一个一个新的 ps3实例了。只不过每个新的ps3实例只有.correctionheiht属性被赋过值,其实属性并未赋值,即全都是空值。其实 你完全可以在生成infolist1列表的每个ps3列时,用函数方法给correctionheiht赋值。根本不用用到“平差计算”按钮来手动点。
exception92 2018-05-09
  • 打赏
  • 举报
回复
WPF是基于“数据驱动”的,由数据的更改就能通知到UI,这也是绑定的目的,真正的ItemsSource赋值 是在xaml中进行Binding赋值,这样其它的操作 直接操作集合即可。 1:Binding的时候 Mode默认就是TwoWay了,不需要手动指定。 2:getData 继承自INotifyPropertyChanged接口,属性实现接口方法。 3:Button_Click_2 中不能对ItemsSource重新赋值,而是对ObservableCollection集合中的实体类的“高差改正数” 属性进行计算,这样会自动更新到界面上。

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧