0

我有一个带有 ObservableCollection 属性的 UserControl。该属性应该用于绑定,但是我不希望它在程序集之外可见,以满足 OOP 的基本规则。这是一个有效的演示示例,但是当我将Data的访问修饰符更改为internal时,它不再起作用:

XAML:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" x:Name="Root">
    <ListBox ItemsSource="{Binding Data, ElementName=Root}"/>
</Window>

和后面的代码:

using System;
using System.Windows;
using System.Collections.ObjectModel;

namespace WpfApplication3
{
    public partial class MainWindow : Window
    {
        private readonly ObservableCollection<string> _data = new ObservableCollection<string>();
        public ObservableCollection<string> Data
        {
            get { return _data; }
        }

        public MainWindow()
        {
            InitializeComponent();
            Data.Add("XXX");
            Data.Add("YYY");
            new System.Threading.Thread(() =>
            {
                for (int i = 0; i < 3; i++)
                {
                    Dispatcher.Invoke(new Action(() => Data.Add("ZZZ " + i)));
                    System.Threading.Thread.Sleep(1000);
                }
            }).Start();
        }
    }
}

实现这一目标的最佳方法是什么?

感谢您的任何努力。

4

2 回答 2

2

尝试在 MainWindow 构造函数中设置 ItemSource

XAML:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" x:Name="Root">
    <ListBox Name="listbox"/>
</Window>

和背后的代码

using System;
using System.Windows;
using System.Collections.ObjectModel;

namespace WpfApplication3
{
    public partial class MainWindow : Window
    {
        private readonly ObservableCollection<string> _data = new ObservableCollection<string>();
        internal ObservableCollection<string> Data
        {
            get { return _data; }
        }

        public MainWindow()
        {
            InitializeComponent();

            listbox.ItemSource = this.Data;
            Data.Add("XXX");
            Data.Add("YYY");
            new System.Threading.Thread(() =>
            {
                for (int i = 0; i < 3; i++)
                {
                    Dispatcher.Invoke(new Action(() => Data.Add("ZZZ " + i)));
                    System.Threading.Thread.Sleep(1000);
                }
            }).Start();
        }
    }
}
于 2013-04-30T02:48:00.750 回答
0

WPF 中的 DataBinding 仅适用于公共属性。

MSDN

用作绑定的绑定源属性的属性必须是类的公共属性。无法访问显式定义的接口属性以进行绑定,也不能访问没有基本实现的受保护、私有、内部或虚拟属性

于 2013-04-30T02:46:41.447 回答