【问题标题】:Silverlight - bind from DataGrid column back to root property of view model?Silverlight - 从 DataGrid 列绑定回视图模型的根属性?
【发布时间】:2011-05-08 13:01:37
【问题描述】:

我有以下 XAML:

<UserControl.Resources>
    <local:MainPageViewModel x:Key="ViewModel" />
</UserControl.Resources>

<Grid x:Name="LayoutRoot" 
      DataContext="{Binding Source={StaticResource ViewModel}}">
    <sdk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}">
        <sdk:DataGrid.Columns>
            <sdk:DataGridTextColumn Header="ID" Binding="{Binding ID}" />
            <sdk:DataGridTextColumn Header="Name" Binding="{Binding Name}" />
            <sdk:DataGridCheckBoxColumn
                Header="Checkbox Column"
                Binding="{Binding Source={StaticResource ViewModel},
                                  Path=SomeBooleanProperty}"/>

        </sdk:DataGrid.Columns>
    </sdk:DataGrid>
</Grid>

所以,基本上我希望将其中一列(复选框列)绑定到直接在 ViewModel 上的某个属性(SomeBooleanProperty),而不是在 Items 集合中的某个项目上的属性。 (是的,这有点做作,但它解决了我的问题。)问题是,根据我的测试,如果您通过 StaticResource 绑定,似乎该值不会基于 INotifyPropertyChanged 事件触发而更新。初始值是正确的,但它永远不会改变。我想不出另一种方法来从列绑定中“退出”Items 绑定并备份到 ViewModel。

我认为在 WPF 中,您可以通过使用 FindAncestor 的 RelativeBinding 来执行此操作。但 Silverlight 中不存在该功能。还有其他方法可以做到这一点吗?

【问题讨论】:

  • +1 好问题!你现在也让我很好奇。您能否简单地确保属性名称不是您的项目源中存在的属性?我认为如果属性不是项目源的成员,它默认为视图模型。
  • 你能提供一些你的源代码吗?我完全尝试了您的 xaml,它可以正常工作。也许您的一些 ViewModel 源代码将有助于定位问题。
  • @TerenceJackson:看起来你是对的。我重建了页面并且它起作用了。请参阅下面的答案。

标签: silverlight binding


【解决方案1】:

我真的不知道发生了什么。根据@TerenceJackson 的评论说它对他有用,我完全重建了有问题的页面和 VM 代码,一切正常。我以非常挑剔的眼光查看了这两段代码以找出不同之处,但我做不到。因此,尽管它困扰着我,但我将不得不继续前进。我想我会留下这个问题,以免有人遇到同样的问题并真正弄清楚原因是什么。

【讨论】:

    【解决方案2】:

    元素绑定不限于“控件”。您可以尝试将元素绑定到 LayoutRoot,因为它在运行时仅基于当前范围内的名称来解决。

    然后它应该拾取您指向的任何元素的 DataContext。

    例如

    <sdk:DataGridCheckBoxColumn
                    Header="Checkbox Column"
                    Binding="{Binding ElementName=LayoutRoot,
                                      Path=SomeBooleanProperty}"/>
    

    如果绑定仍然没有触发,这将是 CheckBoxColumn 的一个特性/缺陷(例如,它从行数据上下文中获取值)

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2010-12-21
      • 2011-05-22
      • 1970-01-01
      • 2012-11-04
      • 2011-08-22
      • 1970-01-01
      • 2017-07-10
      • 2020-07-01
      相关资源
      最近更新 更多