精华内容
下载资源
问答
  • WPF数据绑定

    2021-02-04 15:18:46
    前台绑定后台数据实时更新 新建一个前台xaml文件(这里已前几篇新建的PageMes页面为例),我们在前台添加一个文本框控件,现在要实现的是将前台TextBox的内容与后台变量进行绑定,当后台数据更新时,前台页面的内容...

    前台绑定后台数据,实时更新

    新建一个前台xaml文件(这里已前几篇新建的PageMes页面为例),我们在前台添加一个文本框控件,现在要实现的是将前台TextBox的内容与后台变量进行绑定,当后台数据更新时,前台页面的内容显示也实时更新。

    1.第一步,前台PageMes.xaml文件中添加一个TextBox,内容如下:

    ...
      <Button Content="导入文件" Click="ImportFile" BorderThickness="0" />
      <TextBox Name="textbox_status" TextAlignment="Right" Text="{Binding Text}"/>
    ...
    

    Text="{Binding Text}"将前台TextBox的内容与Text属性绑定了(当前仅指定了TextBox与某实例的Text属性绑定)

    2.第二步,后台PageMes.xaml.cs文件对应添加如下内容:

    namespace wpfbase {
      public partial class PageMes : Page {
        private StatusText statustext; // 实例化一个StatusText类成员
        public PageMes() {
          InitializeComponent();
          statustext = new StatusText(); // 初始化类成员
          // 将前台名为textbox_status控件的数据绑定为statustext成员
          this.textbox_status.DataContext = statustext;
        }
        ...
        private void ImportFile(object sender, RoutedEventArgs e) {
          Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog();
          dialog.DefaultExt = ".png";
          dialog.Filter = @"图像文件(*.jpg,*.png,*.tif,*.gif)|*jpeg;*.jpg;*.png;*.tif;*.tiff;*.gif
          |JPEG(*.jpeg, *.jpg)|*.jpeg;*.jpg|PNG(*.png)|*.png|GIF(*.gif)|*.gif
          |TIF(*.tif,*.tiff)|*.tif;*.tiff";
          Nullable<bool> result = dialog.ShowDialog();
          if(result == true) {
            statustext.Text = dialog.FileName;  // statustext成员Text更新
          }
        }
      }
      ...
      class StatusText : INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;
        private string text;
        public string Text {  // 前台Binding的属性值为此处的Text
          get { return text;}
          set { 
            text = value;
            if (PropertyChanged != null)  // 只要StatusText类的成员改变即执行
              PropertyChanged(this, new PropertyChangedEventArgs("Text"));
          }
        }
      }
    }
    

    说明:
    1.我们在wpfbase空间中定义了一个类StatusText继承至INotifyPropertyChanged抽象类,在这个类中,我们定义了一个PropertyChanged事件类型,同时为该类定义了成员Text,当Text成员有变化时,就会触发产生PropertyChanged事件,这样就实现了内容刷新。
    2.在PageMes的构造函数中,我们初始化一个StatusText类型的变量statustext,并将该变量与前台textbox_status文本框数据绑定,在第一步中我们已经实现了此文本框的内容绑定数据的Text的属性,所以,textbox_status文本框绑定的是statustext变量的Text属性。
    3.在ImportFile函数,statustext.Text = dialog.FileName; 修改statustext成员Text的值,实现对前台数据的实时更新。

    展开全文
  • WPF中两个window ...当我在另一个window改变这个window1绑定的xml文件数据时,数据没有实时更新,只能退出程序然后再次run才能看到更新后的数据,是不是需要重新load一下,但我这个是在xaml中绑定数据怎么load呢
  • 实现了数据的双向绑定,更改DataGrid的数据更新后台数据,更改后台数据会在DataGrid上实时显示。
  • 2,在WPF DataGrid xaml中绑定对应的Inspect_ID列,设为首列,只读,隐藏 3,设置DataGrid的SelectionUint为FullRow属性 4,在窗体加载事件中绑定 DATA_GRID.SelectedValuePath = “Inspect_ID”; 5,设置一个静态.....

    基本流程
    1,MySQL数据表设置自增列,主键,not null,例如定义:Inspect_ID
    2,在WPF DataGrid xaml中绑定对应的Inspect_ID列,设为首列,只读,隐藏
    3,设置DataGrid的SelectionUint为FullRow属性
    4,在窗体加载事件中绑定 DATA_GRID.SelectedValuePath = “Inspect_ID”;
    5,设置一个静态变量,作为更新数据库的判定条件,进入单元格编辑状态,赋初值,结束编辑状态,取值进行比较
    6,将回车换行改为回车移入下一个单元格
    7,实现Ds.Tables[0].RowChanged、Ds.Tables[0].ColumnChanged、DATA_GRID.PreviewKeyDown、DATA_GRID.BeginningEdit、DATA_GRID.CellEditEnding 五个事件处理程序

    最终实现效果:无需换行,编辑完单元格,立即更新数据库

            public static string preValue { get; set; }
            public string Table { get; set; }         //当前表名
            public static DataSet Ds { get; set; }
            public static int CurrentPage { get; set; }         //当前分页
            public static int PageTotal { get; set; }         //总页数
            
            private void InspectRecordLoaded(object sender, RoutedEventArgs e)
            {
            	//生成当前分页的DataSet,此处取最后一页
                CurrentPage = SqlHelper.PageSize(Table);
                PageTotal = CurrentPage;
                Ds = SqlHelper.MakeData(Table, CurrentPage);
                
                Ds.Tables[0].RowChanged += new DataRowChangeEventHandler(Data_Rowchanged);
                Ds.Tables[0].ColumnChanged += new DataColumnChangeEventHandler(Data_Columnchanged);
                
                ((this.FindName("DATA_GRID")) as DataGrid).ItemsSource = Ds.Tables[0].DefaultView;
                DATA_GRID.SelectedValuePath = "Inspect_ID";
                
                DATA_GRID.PreviewKeyDown += new KeyEventHandler(DATA_GRID_PreviewKeyDown);
                DATA_GRID.BeginningEdit += new EventHandler<DataGridBeginningEditEventArgs>(DATA_GRID_BeginningEdit);
                DATA_GRID.CellEditEnding += new EventHandler<DataGridCellEditEndingEventArgs>(DATA_GRID_CellEditEnding);
    
            }
            
            private void DATA_GRID_PreviewKeyDown(object sender, KeyEventArgs e)
            {
                var uie = e.OriginalSource as UIElement;
                if (e.Key == Key.Enter)
                {
                    uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                    e.Handled = true;
                }
            }
            
            private void Data_Columnchanged(object sender, DataColumnChangeEventArgs e)
            {
                UpdateDatabase(e.Column.Table); 
            }
    
            private void Data_Rowchanged(object sender, DataRowChangeEventArgs e)
    
            {
                UpdateDatabase(e.Row.Table);
            }
    
            private void DATA_GRID_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
            {
                preValue = (e.Column.GetCellContent(e.Row) as TextBlock).Text;
            }
      
            private void DATA_GRID_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
            {
                string newValue = (e.EditingElement as TextBox).Text;
    
                if (newValue != preValue && DATA_GRID.SelectedValue != null)
                {
                    //取得单元格的行索引和列索引
                    int editRowIndex = e.Row.GetIndex();
                    int editColumnIndex = e.Column.DisplayIndex;
                    
                    //主动设置该单元格对应的Ds.Tables[0]所在行为已修改状态,触发RowChanged事件
                    Ds.Tables[0].Rows[editRowIndex].SetModified();
                    (e.EditingElement as TextBox).Text = newValue;
                }
            }
            
            public static void UpdateDatabase(DataTable table)
            {
                MySqlConnection mySqlCon = SqlHelper.GetMySqlConnection();
                try
                {
                    mySqlCon.Open();
                    string sql = "select * from e_1";
                    MySqlDataAdapter mySqlAdap = new MySqlDataAdapter(sql, mySqlCon);
                    MySqlCommandBuilder cb = new MySqlCommandBuilder(mySqlAdap);   
                    cb.GetUpdateCommand();
                    
                    mySqlAdap.Update(table);
                }
                catch (MySqlException ex)
                {
    
                    MessageBox.Show(ex.Message);
                    table.RejectChanges(); 
    
                }
                finally
                {
                    if (mySqlCon.State == ConnectionState.Open)
                    {
                        mySqlCon.Close();
                    }
                }
            }
    
    展开全文
  • 当前已经有一个DataGrid,并且绑定了ItemSource进行数据显示。现在需要根据数据库一张表中的数据字段(例如Students表中的Name字段)在这个DataGrid中动态添加列。并实现前端根据Students表实时进行更新。 代码: ...
  • 本人在实现该功能的过程中发现DataGrid控件一个让人十分崩溃的点,就是在编辑完一个单元格的数据之后,需要将焦点移动到下一行或者别的控件后,刚刚编辑完的数据才会被同步到绑定数据对象中。而如果编辑完

        这些天一直在研究WPF,试图用其来进行数据库客户端的制作。DataGrid控件以其数据显示和实时编辑的方便易用,自然是不能不用。

        数据库程序中,往往要实现多级联动这一功能以实现范围的选择等。本人在实现该功能的过程中发现DataGrid控件一个让人十分崩溃的点,就是在编辑完一个单元格的数据之后,需要将焦点移动到下一行或者别的控件后,刚刚编辑完的数据才会被更新到绑定的数据对象中。而如果编辑完一个单元格数据后将焦点移动到其同一行的其他单元格,则刚刚编辑完的数据没有及时更新(这跟INotifyPropertyChanged接口的实现无关,也跟绑定的方式无关)。这就很容易导致程序出错,比如使用DataGrid的模板做“省\市\区”的三级联动下拉列表,当省的选择发生改变时,市还是发生改变前的那些选项,这就跪了。

        在各种百度差点就去翻墙GOOGLE之际,看到了这篇文章,问题就解决!善哉善哉,愿好人一生平安,祝好人长命百岁。

        由于本人刚刚学WPF,该文章谈的一些原理性的东西本人还不太明了,就只贴出解决过程,有需要的可以去上面提到的那篇博客中跟博主交流或者等本人日后了然了些来更新这篇博客的原理部分。

        一.添加一个新类,叫做DataGridHelper,会使用到如下的命名空间:

    using System.Windows;
    using System.Windows.Controls;
        类的声明如下:
    public static class DataGridHelper
    {
        public static void SetRealTimeCommit(DataGrid dataGrid, bool isRealTime)
        {
            dataGrid.SetValue(RealTimeCommitProperty, isRealTime);
        }
    
        public static bool GetRealTimeCommit(DataGrid dataGrid)
        {
            return (bool)dataGrid.GetValue(RealTimeCommitProperty);
        }
    
        public static readonly DependencyProperty RealTimeCommitProperty =
        DependencyProperty.RegisterAttached("RealTimeCommit", typeof(bool),
        typeof(DataGridHelper),
        new PropertyMetadata(false, RealTimeCommitCallBack));
    
        private static void RealTimeCommitCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var dg = d as DataGrid;
            if (dg == null)
                return;
            EventHandler<DataGridCellEditEndingEventArgs> ceHandler = delegate (object xx, DataGridCellEditEndingEventArgs yy)
            {
                var flag = GetRealTimeCommit(dg);
                if (!flag)
                    return;
                var cellContent = yy.Column.GetCellContent(yy.Row);
                if (cellContent != null && cellContent.BindingGroup != null)
                    cellContent.BindingGroup.CommitEdit();
            };
            dg.CellEditEnding += ceHandler;
            RoutedEventHandler eh = null;
            eh = (xx, yy) =>
            {
                dg.Unloaded -= eh;
                dg.CellEditEnding -= ceHandler;
            };
            dg.Unloaded += eh;
        }
    }
        二.在希望控件更新数据的时候,使用如下代码:
    DataGridHelper.SetRealTimeCommit(dataGrid, true);//dataGrid为控件名称
        更新问题便解决了!




    展开全文
  • Wpf DataGrid数据刷新

    2020-09-17 15:17:36
    工作中做一个工具,需要用到DataGrid,经过查询资料 使用ObservableCollection做绑定,实现了后台数据增删,界面实时增减。 但是如果对一个已经存在的项,更改后台数据,则界面不会发生变化。 经过调试发现后台...

    工作中做一个工具,需要用到DataGrid,经过查询资料 使用 ObservableCollection 做绑定,实现了后台数据增删,界面实时增减。

    但是如果对一个已经存在的项,更改后台数据,则界面不会发生变化。

    经过调试发现后台数据内容已经发生了变化,但是界面没有更新。后来去网上查资料发现有人讲当数据发生变化时。

    将ItemsSource = null,再重新绑定。经过测试确实可以改变前台数据。

    但是这种写法等于刷新了所有数据,包括没有改变的内容,如果数据量很大就会带来明显的界面卡顿,对于一个完美主义者是无法接受的。又查了会资料,突然迷糊过来,知道怎么写了,代码如下。

    xmal代码如下:

    <Window x:Class="DataGridTest.MainWindow"

            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:DataGridTest"

            mc:Ignorable="d"

            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">

        <StackPanel>

            <Button Content="改变内容" Click="Button_Click"  Background="AliceBlue"/>

            <Button Content="新增数据" Click="Button_Click_1"  Background="AliceBlue"/>

            <DataGrid Name="dataGrid1" IsReadOnly="True" AutoGenerateColumns="False" RowDetailsVisibilityMode="Collapsed"                   CanUserReorderColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" >

                <DataGrid.Columns  >

                    <DataGridTextColumn   Header="Name" Binding="{Binding Name}" FontSize="22"  Width="*"></DataGridTextColumn>

                </DataGrid.Columns  >

            </DataGrid>

        </StackPanel>

    </Window>

    cs文件

    namespace DataGridTest

    {

        /// <summary>

        /// MainWindow.xaml 的交互逻辑

        /// </summary>

        public partial class MainWindow : Window

        {

            ObservableCollection<people> peoplelist = new ObservableCollection<people>();

            int count1 = 0;

            int count2 = 0;

            public MainWindow()

            {

                InitializeComponent();

            }

            private void Window_Loaded(object sender, RoutedEventArgs e)

            {

                peoplelist.Add(new people

                {

                    Name = "小明"

                });

                peoplelist.Add(new people

                {

                    Name = "小红"

                });

                dataGrid1.ItemsSource = peoplelist;

            }

            private void Button_Click(object sender, RoutedEventArgs e)

            {

                count1 += 1;

                people data;

                try

                {

                    data = peoplelist.ElementAt(0);

                }

                catch (System.Exception ex)

                {

                    return;

                }

                    data.Name = data.Name + count1.ToString();

               }

            private void Button_Click_1(object sender, RoutedEventArgs e)

            {

                count2 += 1;

                peoplelist.Add(new people

                {

                    Name = "小红_"+count2.ToString()

                });

                dataGrid1.ItemsSource = peoplelist;

            }

        }

        public class people : INotifyPropertyChanged

        {

            public event PropertyChangedEventHandler PropertyChanged;

            private string name;

            public string Name

            {

                get { return name; }

                set

                {

                    name = value;

                    if (PropertyChanged != null)

                    {

                        PropertyChanged.Invoke(this,new PropertyChangedEventArgs("Name"));

                    }

                }

            }

        }

    }

    展开全文
  • 工作中做一个工具,需要用到DataGrid,经过查询资料 使用ObservableCollection 做绑定,实现了后台数据增删,界面实时增减。 但是如果对一个已经存在的项,更改后台数据,则界面不会发生变化。 经过调试发现后台...
  • silverlight的动画图表控件,支持数据绑定、数据钻取以及实时更新等功能特点。下面分享一些Visifire使用教程: Visifire图表控件对有大差异数据的图标绘制问题 Visifire图表多线程技术Timer应用详解 Visifire制作...
  • WPF重要的几个概念

    2012-07-18 10:34:00
    上述几个功能一般都是界面和代码进行配合的,比如界面对某个控件的某个属性设置了Binding,而数据源往往来自于代码,因为界面定义时不一定知道数据库里的数据,这些数据实时更新。 总之,WPF的这些新功...
  • WPF重要的几个概念:

    千次阅读 2013-03-07 10:17:28
    上述几个功能一般都是界面和代码进行配合的,比如界面对某个控件的某个属性设置了Binding,而数据源往往来自于代码,因为界面定义时不一定知道数据库里的数据,这些数据实时更新。 总之,WPF的这些新功能都是为了
  • WPF编程宝典 part1

    2015-07-20 23:33:59
    22.2.1 创建数据绑定的TreeView 控件 614 22.2.2 将DataSet对象绑定到TreeView 控件 617 22.2.3 即时创建节点 618 22.3 DataGrid控件 621 22.3.1 改变列的尺寸与重新安排列 622 22.3.2 定义列 623 22.3.3 设置列的...
  • WPF编程宝典 part2

    2015-07-20 23:35:21
    22.2.1 创建数据绑定的TreeView 控件 614 22.2.2 将DataSet对象绑定到TreeView 控件 617 22.2.3 即时创建节点 618 22.3 DataGrid控件 621 22.3.1 改变列的尺寸与重新安排列 622 22.3.2 定义列 623 22.3.3 设置列的...
  • 或者开一个定时器(System.Threading.Timer)去实时更新我们的绑定数据源。 一般情况下,我们的界面更新是很正常的。 但是,当我们更新的数据源很多,更新频率很快时。晃动我们鼠标(在控件面板上移动)时,有时会...
  • 在《WPF/Silverlight的数据绑定设计的真糟糕》文中批评了WPF/SL的数据绑定机制,拿的是Flex的数据绑定与其对比。本文介绍应用Flex的数据绑定来解决一个实际问题——多语言实时切换的问题,以说明简洁的数据绑定机制...
  • WPF优化监控视频CPU占用高以及卡顿掉帧的解决方案 最近项目需求,需要做一个视频软件要求有...做出类似视频播放的效果,面对如此频繁的数据更新,初步试用了一下继承于FrameworkElement的Image控件,进行数据绑定,...
  • JS 实时刷新页面

    2017-05-05 13:24:00
     所谓“实时”,当然不是像WPF那样,通过数据绑定进行精准更新,可是通过计时器,定时更新。 JS 代码: 1 setInterval(function () { 2 $.get('/Home/Test', function (data) { 3 // 使用 data 进行某些...
  • 最开始想要实现实时颜色变化,搞了很久都实现不了,这个属性就算绑定了后台变化值了前面好像也接受不到,可能因为他不是一个Commad的原因吧,然后我是投机取巧了一下等于是,保存的时候把那些值在更新一下 ...
  • 在使用WPF时,为与前台UI绑定数据,经常使用ObservableCollection ,然而当我们希望在后台线程更新ObservableCollection ,从而使前台实时显示时,会抛出System.NotSupportedException,导致UI crossthreading ...
  • visifire是一款基于WPF&silverlight的动画图表控件,支持数据绑定、数据钻取以及实时更新等功能特点。重要一点是能展现特别炫的效果。下面简单介绍一下 他的简单使用 首先 下载 Visifire 的dll 加载到工具箱中,会...
  • MVVMLight介绍以及在项目中的使用

    万次阅读 2020-08-14 09:21:16
    相对于之前把逻辑结构写在Code Behind 的方式,MVVM模式几乎完全解耦了视图和逻辑业务的关系,通过数据绑定和命令绑定来处理UI属性及事件驱动; 同时,ViewModel中对属性的变更也会通知到View前端,让View前端实时...
  • 介绍了WPF编程,包括样式、数据驱动的应用程序和文档、ASP.NET Web Forms以及ASP.NET MVC 目 录 第Ⅰ部分 C# 语 言 第1章 .NET体系结构 1.1 C#与.NET的关系 1.2 公共语言运行库 1.2.1 平台无关性 1.2.2 提高性能 ...
  • Knockout API 中文版

    2013-05-20 21:18:19
    jQuery 没有基本的数据模型的概念,所以需要获取数据的数量(从table/div或者专门定义的CSS class),如果需要在某些SPAN里显示数据的数量,当添加新数据的时候,你还要记得更新这个SPAN的text。当然,你还要判断当...
  • 保持了依赖同一块Model的不同View显示数据实时性和准确性。我们每天都在用的观察者模式,在几十年前就已经被大神们整合到MVC的架构当中。 这里有一个...
  • 实时绘图功能可以方便地动态排序、分组修改了的数据。 ASP.NET MVC Visual Studio 2010包含ASP.NET MVC 2.0。Visual Studio 2013发布后,就可以使用ASP.NET MVC 5.0了。ASP.NET MVC提供了许多开发人员期待的、使用...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

wpf数据绑定实时更新