【问题标题】:Using private field as ItemsSource of ItemsControl?使用私有字段作为 ItemsControl 的 ItemsSource?
【发布时间】:2011-08-22 15:39:39
【问题描述】:

让我们来上课:

public partial class MyControl: UserControl{
    private ObservableCollection<string> names = 
            new ObservableCollection<string>();
    ...
}

然后在 XAML 中为 UserControl 与在 XAML 中的类 MyControl 相同:

<UserControl x:Class="MyProject.MyControl" xmlns="..." xmlns:x="...">
    <ItemsControl ItemsSource="{Binding ???????}" />
</UserControl>

是否可以将??????? 替换为将ItemsSource 绑定到后面代码中的names 字段的东西?如果有办法,正确的方法是什么?如果没有办法names 必须是依赖属性而不仅仅是一个字段?

【问题讨论】:

    标签: .net wpf data-binding binding dependency-properties


    【解决方案1】:

    您只需要为名称创建一个公共 getter 属性

    public IEnumerable<string> Names
    {
         get{return names;}
    }
    

    它不需要是依赖属性。

    然后你的 xaml 可以是

    <ItemsControl ItemsSource="{Binding Names}" />
    

    编辑: 只需重新阅读您的标题。如果您想保持名称私有,则必须在后面的代码中进行绑定。

            Binding b = new Binding();
            b.Source = names;
            itemsControl.SetBinding(ItemsControl.ItemsSourceProperty, b);
    

    【讨论】:

    • 那么这是正确的做法吗?但是我不得不公开names,因为它实际上已经公开了——现在每个人都可以向names添加一些东西。
    • 您可以执行代码或将名称集合公开为 IEnumerable,因为这是只读的。
    • 或者您可以直接将names 分配给ItemsControl 的ItemsSource,无需绑定...
    • 如果我将其公开为IEnumerable&lt;string&gt;(仅使用带有get 访问器的属性)并将一些新的string 添加到names 中,更改会反映在GUI 中吗?我正在使用ObservableCollection,因为我想要这种行为......
    • 是的,因为虽然它作为一个 IEnumerable 公开,但它仍然是一个 ObservableCollection 并且会通知 UI。而且您只能从类内部添加名称,因为这是可观察的名称集合在范围内的唯一位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多