Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';关于绑定到非属性(即字段)的官方说法是什么?_C#_Wpf_Xaml_Data Binding - Fatal编程技术网

C# 什么';关于绑定到非属性(即字段)的官方说法是什么?

C# 什么';关于绑定到非属性(即字段)的官方说法是什么?,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,从《WPF 4释放》一书中: 尽管源属性可以是任何.NET上的任何.NET属性 对象,对于数据绑定目标,情况并非如此。目标 属性必须是依赖项属性。还请注意,源代码 成员必须是真实(和公共)属性,而不仅仅是一个简单字段 然而,这里有一个反例来反驳源必须是属性的说法。此程序将标签和列表框绑定到类型为ObservableCollection的正常字段 Xaml: C#: 使用系统; 使用System.Windows; 使用System.Collections.ObjectModel; 命名空间绑定

从《WPF 4释放》一书中:

尽管源属性可以是任何.NET上的任何.NET属性 对象,对于数据绑定目标,情况并非如此。目标 属性必须是依赖项属性。还请注意,源代码 成员必须是真实(和公共)属性,而不仅仅是一个简单字段

然而,这里有一个反例来反驳源必须是属性的说法。此程序将
标签
列表框
绑定到类型为
ObservableCollection
的正常字段

Xaml:


C#:

使用系统;
使用System.Windows;
使用System.Collections.ObjectModel;
命名空间绑定ObservableCollectionCountLabel
{
公共部分类主窗口:窗口
{
公共可观测收集点;
公共主窗口()
{
Add(“ints”,ints=newobserveCollection());
初始化组件();
}
私有无效添加\单击(对象发送者,路由目标)
{
ints.Add(Convert.ToInt32(textBox.Text));
}
私有无效删除单击(对象发送者,路由目标e)
{
如果(整数计数>0)整数删除(0);
}
}    
}

那么什么是数据绑定源的官方说法呢?我们应该只绑定属性吗?或者字段在技术上也是允许的?

否,它不会特别绑定到字段,而是使用
静态资源绑定到字段:

Binding Source={StaticResource ints //StaticResource !!

您可以定义一个静态资源(基本上)并绑定到它。如果你想直接绑定到你的类,你需要按照文档的建议使用
属性。

谢谢你的澄清!绑定到属性还允许您使用INotifyPropertyChanged,这是WPF的一个主要功能。
using System;
using System.Windows;
using System.Collections.ObjectModel;

namespace BindingObservableCollectionCountLabel
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<int> ints;

        public MainWindow()
        {
            Resources.Add("ints", ints = new ObservableCollection<int>());

            InitializeComponent();
        }

        private void add_Click(object sender, RoutedEventArgs e)
        {
            ints.Add(Convert.ToInt32(textBox.Text));
        }

        private void del_Click(object sender, RoutedEventArgs e)
        {
            if (ints.Count > 0) ints.RemoveAt(0);
        }
    }    
}
Binding Source={StaticResource ints //StaticResource !!