【问题标题】:Just curious: why WPF binding to control's properties not work?只是好奇:为什么 WPF 绑定到控件的属性不起作用?
【发布时间】:2016-06-24 16:46:58
【问题描述】:

我熟悉 WPF 绑定和 MVVM。一天在Baidu Zhidao回答问题时遇到了这样的情况:

<Grid>
    <ListBox Name="lb" DisplayMemberPath="S"/>
</Grid>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.lb.ItemsSource = new ObservableCollection<Item>()
        {
            new Item("aa"),
            new Item("bb"),
            new Item("cc"),
        };
    }
}

public class Item : ListBoxItem //
{
    public Item(string s)
    {
        this.S = s;
    }
    public string S { get; set; }
}

如果 Item 继承 ListBoxItem 或其他控件,则不显示任何内容。 但为什么? S 不总是对象的属性吗?

【问题讨论】:

    标签: c# wpf data-binding controls


    【解决方案1】:

    当您将ItemsSource 绑定到数据时,它会为每个元素创建一个ListBoxItem,并使用您指定的DisplayMemberPath 显示它。但是,如果您绑定到您在代码隐藏中自己创建的 ListBoxItem 数组,那么它将使用这些数组。在您发布的代码中,您的Item 类继承了ListBoxItem,因此它是一个GUI 元素,而不是数据。这是不好的做法,但如果这是您真正打算做的,那么您不需要 S 属性,只需直接设置 Content

    public class Item : ListBoxItem
    {
        public Item(string s)
        {
            this.Content = s;
        }
    }
    

    但是如果你想正确地(例如 MVVM)那么就不要继承 ListBoxItem 并且不要直接在代码隐藏中操作 UI 元素:

    public class Item
    {
        public Item(string s)
        {
            this.S = s;
        }
        public string S { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2018-10-26
      • 1970-01-01
      • 2012-04-03
      • 2017-11-24
      • 1970-01-01
      相关资源
      最近更新 更多