首页 > 其他分享 >WPF - 002 数据更新

WPF - 002 数据更新

时间:2023-07-16 15:22:38浏览次数:29  
标签:Name void 更新 002 private UserInfo WPF public 属性

数据更新

数据绑定不仅可以绑定现有的控件属性,也可以绑定自定义类的属性,通过 INotifyPropertyChanged 接口实现绑定源到绑定目标的消息通知。

非列表属性的更新

例如:以下代码通过定义一个 User 类,并将其中的 Name 属性绑定至 TextBoxText 属性上,为了实现后台属性更新时对前台UI的通知,User 类需要实现 INotifyPropertyChanged 接口,并在属性的 Setter 中调用 OnPropertyChanged 函数,触发属性更改事件。

后台代码:

/// <summary>
/// DataUpdateDemo1.xaml 的交互逻辑
/// </summary>
public partial class DataUpdateDemo1 : Window
{
    User user = new User();
    public DataUpdateDemo1()
    {
        InitializeComponent();

        user.Name = "Gerry";
        // 指定窗口的 DataContext 属性
        this.DataContext = user;
    }

    private void BtnUpdateSource_Click(object sender, RoutedEventArgs e)
    {
        this.user.Name = "Update UserInfo";
    }
}

/// <summary>
/// 创建 User 类
/// </summary>
public class User : INotifyPropertyChanged
{
    private string? _name;

    public string? Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged(nameof(Name)); }
    }


    public event PropertyChangedEventHandler? PropertyChanged;

    /// <summary>
    /// 当指定的某个属性发生变化的时候对界面UI的线程推送更新消息
    /// </summary>
    /// <param name="PropertyName"></param>
    public void OnPropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
    }
}

前台代码:

<StackPanel Margin="20">
    <TextBox Width="150" Text="{Binding Name}"></TextBox>
    <Button Margin="0 10 0 0" Content="更新源" Name="BtnUpdateSource" Click="BtnUpdateSource_Click" Width="150"></Button>
</StackPanel>

img

列表属性的更新

ItemControl 类的 DisplayMemberPath 属性可以指定需要绑定的列表内的对象的属性。例如:使用 ListBox 显示用户信息,ListBoxItemSource 指定关联到列表框的用户信息集合,DisplayMemberPath 指定需要显示的用户信息对象的属性。
此时需要使用 ObservableCollection 类初始化一个 UserInfo 对象列表,ObservableCollection 内部已经实现了 INotifyPropertyChanged 接口,因此对列表框内的用户信息对象进行删除和添加可以反馈到 UI 界面,但是对用户信息的修改无法反馈至 UI,这是由于对列表框的用户信息对象的属性进行更改不会造成对象引用的变更,因此无法反馈至UI界面。为了实现对象属性变更对前台UI的通知,需要对 UserInfo 类也实现 INotifyPropertyChanged 接口。

/// <summary>
/// DataUpdateDemo2.xaml 的交互逻辑
/// </summary>
public partial class DataUpdateDemo2 : Window
{
    private ObservableCollection<UserInfo> users = new ObservableCollection<UserInfo>();

    public DataUpdateDemo2()
    {
        InitializeComponent();

        // 初始化集合中的元素
        InitialzedUsers();
        // 绑定到用户集合列表框
        lbUsers.ItemsSource = users;
    }

    private void InitialzedUsers()
    {
        users.Add(new UserInfo { Name = ".NET Core"});
        users.Add(new UserInfo { Name = ".NET Framework"});
    }

    private void BtnAdd_Click(object sender, RoutedEventArgs e)
    {
        users.Add(new UserInfo { Name = "Python" });
    }

    private void BtnUpdate_Click(object sender, RoutedEventArgs e)
    {
        if (lbUsers.SelectedItem != null)
        {
            (lbUsers.SelectedItem as UserInfo)!.Name = "Golang";
        }
    }

    private void BtnDelete_Click(object sender, RoutedEventArgs e)
    {
        if (lbUsers.SelectedItem != null)
        {
            users.Remove((lbUsers.SelectedItem as UserInfo)!);
        }
    }
}

public class UserInfo : INotifyPropertyChanged
{
    private string? _name;

    public string? Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged(nameof(Name)); }
    }


    public event PropertyChangedEventHandler? PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

img

标签:Name,void,更新,002,private,UserInfo,WPF,public,属性
From: https://www.cnblogs.com/snoopy1866/p/17557895.html

相关文章

  • wpf ICommand接口 MVVM
    先来点儿抽象的,在mvvm编程模式的命令中,有两个主要的角色,invoker和receiverinvokerinvoker是一段可以执行一定逻辑的代码一般的,它是在UI框架的context中的用户与之交互的UI元素。receiverreceiver是invoker触发时会执行的逻辑在MVVM 中,receiver通常是viewmodel中需要被调......
  • B站视频WPF实战教程修改代码
    P36HttpRestClient.cs部分代码publicasyncTask<ApiResponse>ExecuteAsync(BaseRequestbaseRequest){//urivaruri=newUri(apiUrl+baseRequest.Route);//newrestrequest//adduriv......
  • vue中$set和$forceUpdate强制更新视图层的区别
    $forceUpdate原理:调用notify() 强制视图更新  $set原理:defineReactive(this.data数据,要劫持得数组索引或对象键,默认值)   建立响应式依赖  指定数据更新使用场景:如果data数据的层级过深,导致无法响应式显示解决方法一:$set()this.$set(target,key,value)解......
  • WPF - 001 数据绑定
    数据绑定WPF数据绑定四大要素:绑定源、绑定源属性、绑定目标、绑定目标属性。绑定源可以是:CLR对象ADOXMLDependencyObject绑定目标可以是:DependencyObject能够绑定的属性都是依赖属性,即DependencyProperty,所有DependencyProperty的值都是Object->Denpende......
  • 更新预警(bushi)
    一回首,上次更新已经是将近3个月前了。但是博主不是似了,也不是逍遥快活游山玩水纸醉金迷乐不思蜀,而是上班太忙还是单休,所以没什么时间更新博客。但是今天我要开始忏悔了!预计更新以下几个专题(不一定真的会全部更新):1.计算几何专题主要包括初步的继续(简单的定理,常见数据结构的......
  • 通过修改注册表的方式延迟Windows更新时间
     通过修改注册表,我们可以将暂停更新的天数修改成自己期望的,比如100000天。在小娜或者运行中输入regedit打开注册表编辑器,展开至HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings右键点击Settings,选择新建-DWORD(32位)值,命名为FlightSettingsMaxPauseD......
  • 我们开始更新啦!
     亲爱的读者们:我非常激动地宣布,我们专注于探索和分享计算机科学的广阔领域的博客将于2023年7月17日开始更新!计算机科学是一个广泛而精彩的领域,涉及到诸多知识和技术。在我的博客中,我将继续深入探索各种主题,帮助你们进一步了解和掌握计算机科学的精髓。计算机科学是一个令......
  • WPF 实现 Message 消息提醒控件
    WPF实现Message消息提醒控件控件:Message作者:WPFDevelopersOrg-驚鏵原文链接:https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET4至.NET6;VisualStudio2022;接着上一篇1)新增MessageListBoxItem.cs代码如下:新增了名为MessageTy......
  • 深入浅出WPF——P91把子集集合的元素当Path
    publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();List<Country>countryList=newList<Country>(){newCountry......
  • WPF CheckBox勾选框大小设置
    1、设置CheckBox,FontSize,只有字体发生变化,前面的勾选框太小,可以设置LayoutTransform<StyleTargetType="CheckBox"><SetterProperty="HorizontalAlignment"Value="Left"/><SetterProperty="LayoutTra......