【问题标题】:DataContext scope during binding绑定期间的 DataContext 范围
【发布时间】:2015-05-19 20:46:28
【问题描述】:

我有一个 View A,它有一个 UserControl U,其中包含自己的 UserControl UChild

当我设置 A 的 DataContext 时,UCild 是否会使用直接绑定到其祖父母的属性(即 UChild 中的 { Binding PropertyFromA })来获取 A 的 DataContext?

我正在努力实现这一目标,但在我的情况下,孙子似乎没有获得 DataContext。

编辑:

我使用的一些代码:

我的绑定发生在 VM 内部,其中 BookList 是一个被书籍填充的 ObservableCollection:

    /// <summary>
    /// 
    /// </summary>
    public bool FillBooksCtrlList()
    {
        List<Book> list = DBHelper.GetRecipes();
        if (list == null)
        {
            return false;
        }
        else
        {
            BookList = new ObservableCollection<Book>(list);
            foreach (Book book in BookList)
            {
                BookCtrlList.Add(new BookCtrl { DataContext = book, Margin = new Thickness(0, 10, 10, 0) });
            }
            return true;
        }
    }

简而言之,我在 BookPanelCtrl 内创建了一个 BookCtrl 的实例 属于 MainView

也许我绑定的方式有问题?

【问题讨论】:

  • 一些代码会有所帮助,但是是的,您应该能够将 PropertyFromA 绑定到 UChild。
  • 是的,请看我的小补充。
  • 为什么要动态创建控件?为什么不将 BookList 绑定到 View 中的控件(如 ListControl)?
  • 我正在尝试绑定到控件列表,但首先需要以某种方式填充该列表,对吧?

标签: wpf data-binding user-controls scope


【解决方案1】:

我想你想要这样的东西。在您的 ViewModel 中,您有一个 ObservableCollection 包含 Books:

public class SomeViewModel {
    private ObservableCOllection<Book> _books;
    public ObservableCollection<Book> Books 
    {
        get
        {
            return _books;
        }
        set
        {
            _books = value;
            RaisePropertyChanged("Books");
        }
    }
}

public bool FillBooksCtrlList()
{
    List<Book> list = DBHelper.GetRecipes();
    if (list == null)
    {
        return false;
    }
    else
    {
        Books = new ObservableCollection<Book>(list);
        return true;
    }
}

然后,在您的视图中,您可能会有如下内容:

<UserControl DataContext="SomeViewModel">
    <ListBox ItemsSource="{Binding Books}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Title}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</UserControl>

这样,UserControl 绑定到 ViewModel,ListBox 绑定到您的 Books 列表,ListBox 中的每个项目绑定到一本书的 Title 属性(我我猜书有标题)。

希望这会有所帮助。

【讨论】:

  • 您的建议帮助我解决了问题。谢谢!
猜你喜欢
  • 2018-04-11
  • 2012-02-19
  • 2017-12-20
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多