【问题标题】:Two way Data Binding with usercontrol object与用户控件对象的两种方式数据绑定
【发布时间】:2015-04-28 17:10:41
【问题描述】:

我对数据绑定有点陌生。我设法进行了单向数据绑定,但在进行双向数据绑定时遇到了一些麻烦。

我制作了1)a 用户控件,其中包含一些文本块, 2)具有一些字符串属性的类, 3)使用此类生成具有这些属性的对象的 ObservableCollection,4)由 ObservableCollection 生成的列表视图,并将用户控件作为项目的数据模板。

为了将类的属性与用户控件的 TextBlock 绑定,我在 XAML 中编写了以下代码:

<TextBlock x:Name="MyTextBlock" Text="{Binding TextBlock_Property}" />

MyTextBlock 是用户控件内的文本块,TextBlock_Property 是我创建的类的属性之一。 我也试过Text="{Binding TextBlock_Property, Mode=TwoWay}",但没有发现任何区别。

注意:当我更改创建对象的属性时,文本块也会更改,但是当我更改文本块内容时,属性不会更新。

更新:我做的课是

class MyClass
{
    public string Title { get; set; }
    public string TextBlock_Property { get; set; }

    public MyClass(string title, string textBlock_Property)
    {
        Title = title;
        TextBlock_Property = textBlock_Property;
    }
}

【问题讨论】:

  • W8 我要搜索这个 Dependency 属性,因为不确定它是什么,没有使用过类似的东西。
  • 我不认为这是一个依赖属性问题。看起来他只是绑定到一个属性。我们可以看到具有您属性的 VM 或代码吗?如果你这样做了,你在哪里设置你的数据上下文?
  • @user2975038 更改文本块内容是什么意思? TextBlock 是只读控件,不允许用户输入
  • @user2975038 在 WPF 中处理数据绑定对象时,不应设置 TextBlock.Text = "Something",而应设置 MyClass.TextBlock_Property = "Something",其中 MyClass 是 TextBlock 对象的数据上下文和 Text 的源属性绑定

标签: c# wpf xaml data-binding 2-way-object-databinding


【解决方案1】:

MyClass 类必须实现INotifyPropertyChanged,而TextBlock_Property 属性发出OnPropertyChanged("TextBlock_Property") 事件以更新绑定。

    private string _TextBlock_Property;

    public string TextBlock_Property
    {
        get { return _TextBlock_Property; }
        set { _TextBlock_Property = value; OnPropertyChanged("TextBlock_Property"); }
    }

要通知 Xaml/绑定控件数据已更改,必须在包含属性的类上实现 INotifyPropertyChange,其实例位于 DataContext 中。下面是我用来实现接口INotifyPropertyChanged的代码。

public class MyClass : INotifyPropertyChanged
{
        /// <summary>
        /// Event raised when a property changes.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Raises the PropertyChanged event.
        /// </summary>
        /// <param name="propertyName">The name of the property that has changed.</param>
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
}

要完整查看此操作,请查看我的博客文章Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding.

【讨论】:

  • 你能解释一下第二部分吗?如果我理解正确,第一部分是在开头写这个:class MyClass : INotifyPropertyChanged
  • 我也收到此错误:“Project_Name.MyClass”没有实现接口成员“System.ComponentModel.INotifyPropertyChanged.PropertyChanged”
  • 当我写 OnPropertyChanged 时,它要求我生成一个方法 OnPropertyChanged() 以便能够运行。
  • @user2975038 查看我对实现INotifyPropertyChanged 的修改。
  • 我不知道我做错了什么,但它仍然不起作用:/也许是因为我在用户控件的按钮中有一个 clcik 事件,它改变了MyTextBlock.Text = "Something";(就像@ Rachel 在 cmets 中说)但我不能在 usercontrol 代码中调用它:MyClass.TextBlock_Property = "Something"
猜你喜欢
  • 2017-12-29
  • 2011-02-23
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多