首页 > 解决方案 > UWP 绑定属性到 ItemsSource 的当前项

问题描述

我为我的页面设置了以下设置:

   <ListView ItemsSource="{Binding RecentResults}">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsWrapGrid Background="Transparent" Orientation="Horizontal" ItemWidth="400" ItemHeight="300" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ui:CarResultControl Result="{Binding}" Padding="0" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我绑定到一个本地属性,该属性异步提供我的结果。这工作得很好。

现在我CarResultControl绑定到它的本地Result属性(它是一个DependencyProperty)。当我指定时Result={Binding},属性 get 已更新,但未按预期使用CarResultbut CarResultControl。如果我使用Result={Binding Path=.}或类似,它根本不会更新。

据我在 WPF 中习惯它{Binding}实际上绑定到数据对象本身,而不是您要附加绑定的控件。CarResult有趣的是,当我必须为Result选择绑定路径时,IntelliSense 实际上会显示预期对象的属性。

UWP 又在这里做自己的事情了,我只是一个傻瓜做错了还是这真的是一个错误?我挣扎了足够长的时间,找不到任何有关它的信息。

标签: c#bindinguwp

解决方案


这实际上应该按照您期望的方式工作,除非您更改DataContext.CarResultControl

UserControls实际上以一种有点奇怪的方式工作 - 当您this.DataContext = this在构造函数中设置时,属性上的绑定实际上将与UserControl自身相关。

要解决此问题,您必须确保不要更改DataContext控件本身。最简单的方法是添加x:Name到根目录Grid(或您在内容中拥有的任何控件UserControl,然后设置其DataContext

RootGrid.DataContext = this;

这样,您将把数据上下文RootGrid设置为控件本身,但用户控件的属性将绑定到相对于用户控件所在位置的数据上下文,这里是列表项。


推荐阅读