为啥 DataContext 为 ListView 项目之外的项目返回空值?

Posted

技术标签:

【中文标题】为啥 DataContext 为 ListView 项目之外的项目返回空值?【英文标题】:Why the DataContext returns null value for the out of the ListView Items?为什么 DataContext 为 ListView 项目之外的项目返回空值? 【发布时间】:2019-02-15 18:04:58 【问题描述】:

我尝试使用以下代码 sn-ps 在 ListViewItems 模板中显示组合框项目。我尝试在组合框加载事件中获取组合框的数据上下文。并且 datacontext 仅返回查看的 listViewItems 的值。它返回列表视图项目组合框外的空值。

<ListView ItemsSource="Binding PersonsTest, Mode=OneWay" x:Name="TieLines">
<ListView.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <ComboBox DataContext="Binding Orders" ItemsSource="Binding Numbers" Loaded="ComboBox_Loaded" Width="250" />
        </StackPanel>
    </DataTemplate>
</ListView.ItemTemplate>

问题 为什么在 ListView 中的视图项之外的 DataContext 值返回为 null? 如何从视图 ListViewItems 中获取数据上下文? 或者如果我需要启用任何其他属性以在 XAML 级别绑定 ComboBox DataContext?

【问题讨论】:

你能给出PersonsTestOrdersNumbers的定义吗? 对于您的问题:您正在将列表视图数据上下文绑定到一个名为“外部”数据上下文的 Orders 的属性。可能是整个视图DataContext。首先,您必须定义 DataContext 并将其分配给包含列表视图的视图元素,然后您必须在其中创建一个名为“Orders”的公共属性。我不知道你为什么要做这次旅行 请同时提供设置整个视图的del DataContext的代码 【参考方案1】:

仅从数据绑定属性的名称来看,您很可能错误地使用了绑定。当您将PersonsTest 绑定到ItemsSourceListView 时,这意味着对于PersonsTest 集合中的每个人,该控件采用ItemTemplate 并填充它,就好像模板的DataContext 是特定的人一样.假设我们目前正在为人员 P 实例化模板。

现在,当您使用 Binding Orders 时,您实际上是在使用 p.Orders 属性。但是,当您将ComboBoxDataContext 设置为p.Orders 时,现在以下绑定Binding Numbers 也变为相对p.Orders。所以Binding Numbers 基本上意味着Binding p.Orders.Numbers。我想这不是你想要的,因为如果Orders 有一个名为Numbers 的属性,我会感到惊讶。

我希望您将ComboBox.ItemsSource 绑定到Orders,然后绑定ComboBox.ItemTemplate 并依次自定义它而不是设置DataContext,但由于我不知道您的数据模型是什么,所以我我只是猜测。关键是您可能根本不需要设置ComboBox.DataContext,只需正确设置ItemsSource 属性即可。

【讨论】:

以上是关于为啥 DataContext 为 ListView 项目之外的项目返回空值?的主要内容,如果未能解决你的问题,请参考以下文章

DataContext 用于在 DataTemplate 中将 UserControl 与 ViewModel 绑定

为啥 Linq2DB 在处理 DataContext 后执行 SQL 语句

为啥在 XAML 中绑定 MainWindow 数据上下文与使用 this.datacontext=this 在代码隐藏中绑定的行为不同?

为啥只有 ListView.builder() 中的内容不滚动?

为啥我的 Android ListView 选择多个项目?

绑定与x:绑定,使用StaticResource作为默认值以及它们在DataContext中的差异