使用 INotifyPropertyChanged 的 WPF Xaml 绑定类实例

皮埃尔·佐丹奴

我在使用 XAML 中的数据绑定时遇到问题。问题如下,我想从我的 ExampleClass 的一个实例更新一个标签。我看到两种方法,但其中一种不起作用。第一个是(在示例代码 label1 中):在您的 xaml.cs 中定义一个属性,该属性是您对 ExampleClass 实例的引用,在您的 xaml 中只需编写 YourPropertyReferenceToExampleClass.PropertyName 但它不起作用第二个很简单(在示例代码 label2 中) , 将标签的 dataContext 设置为 ExampleClass 的实例,并在您的 xaml 中简单地写入 PropertyName。

下面的代码(Xaml):

<Window x:Class="SimpleBinding.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:SimpleBinding"
    mc:Ignorable="d"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="MainWindow" Height="137.03" Width="255.263">
<Grid>
    <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="45,76,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    <Label x:Name="label" Content="{Binding One}" HorizontalAlignment="Left" Margin="10,14,0,0" VerticalAlignment="Top"/>
    <Label x:Name="label1" Content="{Binding T.Name}" HorizontalAlignment="Left" Margin="10,45,0,0" VerticalAlignment="Top"/>
    <Label x:Name="label2" Content="{Binding Name}" HorizontalAlignment="Left" Margin="10,45,0,0" VerticalAlignment="Top"/>

</Grid>

下面的代码(Xaml.cs):

using System.ComponentModel;
using System.Windows;

namespace SimpleBinding
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private string _one;
        public string One
        {
            get => _one; set
            {
                _one = value;
                OnPropertyChanged("One");
            }
        }

        public ExampleClass T { get; private set; }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            One = "ciao";
            T = new ExampleClass();
            label2.DataContext = T;
            T.Name = "foo";
        }
    }
}

下面的代码(ExampleClass.cs):

using System.ComponentModel;

namespace SimpleBinding
{
    public class ExampleClass : INotifyPropertyChanged
    {
        private string _name;

        public string Name
        {
            get
            {
                return _name;
            }

            set
            {
                if (_name == value) return;

                _name = value;
                OnPropertyChanged("Name");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

第一种方法应该如何工作?

克莱门斯

只需为该属性触发 PropertyChanged 事件T

private ExampleClass t;
public ExampleClass T
{
    get { return t; }
    private set
    {
        if (t != value)
        {
            t = value;
            OnPropertyChanged(nameof(T));
        }
    }
}

当您为T属性分配新值并希望{Binding T.Name}更新其目标时,需要更改通知

private void Button_Click(object sender, RoutedEventArgs e)
{
    ...
    T = new ExampleClass(); // requires change notification
    label2.DataContext = T; // avoid this
    T.Name = "foo";
}

您应该更喜欢使用{Binding T.Name}over{Binding Name}以避免需要设置除 MainWindow 之外的任何其他 DataContext。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实现INotifyPropertyChanged的类。WPF

来自分类Dev

使用INotifyPropertyChanged在WPF中绑定系统相关信息

来自分类Dev

不使用XAML进行绑定[WPF]

来自分类Dev

WPF / XAML绑定:使用实际的DataContext

来自分类Dev

不使用XAML进行绑定[WPF]

来自分类Dev

WPF:用户界面未使用INotifyPropertyChanged更新

来自分类Dev

使用 INotifyPropertyChanged 如何单击 wpf 按钮

来自分类Dev

在 WPF 应用程序中使用 INotifyPropertyChanged

来自分类Dev

WPF XAML数据绑定

来自分类Dev

WPF文本框未使用数据绑定,iNotifyPropertyChanged和PropertyChanged触发器更新

来自分类Dev

当我绑定到IEnumerable时,WPF如何知道使用INotifyPropertyChanged?

来自分类Dev

从XAML中绑定页面后的代码获取或设置INotifyPropertyChanged类的属性值

来自分类Dev

WPF窗口未使用XAML中的绑定更新

来自分类Dev

wpf使用XAML的数据绑定不起作用

来自分类Dev

WPF xaml:无法使用本地绑定数据

来自分类Dev

在 WPF 中使用 XAML 和绑定创建 DataGrid

来自分类Dev

WPF 无法找到使用参考绑定的源 - xaml

来自分类Dev

如何使用 PowerShell 执行 WPF/XAML 的数据绑定

来自分类Dev

XAML WPF的绑定/引用方法

来自分类Dev

WPF数据绑定到XAML

来自分类Dev

WPF XAML绑定不会更新

来自分类Dev

当需要该类WPF的多个实例时,在模型内进行INotifyPropertyChanged

来自分类Dev

使用INotifyPropertyChanged接口绑定Winform图表

来自分类Dev

使用XAML图像源的WPF

来自分类Dev

即使使用INotifyPropertyChanged,WPF记录也没有更新

来自分类Dev

WPF在XAML上获取类实例空引用

来自分类Dev

使用INotifyPropertyChanged

来自分类Dev

使用INotifyPropertyChanged

来自分类Dev

XAML中的WPF ListView绑定ItemsSource

Related 相关文章

热门标签

归档