2010-11-11 53 views
3

我有以下XAML:Silverlight - 从DataGrid列绑定回视图模型的根属性?

<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> 

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

我认为,在WPF中,你可以用一个使用FindAncestor的RelativeBinding来做到这一点。但是Silverlight中不存在该功能。还有其他方法可以完成这个吗?

+0

+1好问题!你现在也好奇我。你能否简单地确定属性名称不是你的项目源中存在的属性?如果该属性不是该项目源的成员,我认为它默认为视图模型。 – 2010-11-11 16:04:59

+0

您能否提供一些您的源代码。我试着用你的xaml工作。也许你的一些ViewModel源代码可以帮助你找到问题。 – TerenceJackson 2010-11-11 18:00:17

+0

@TerenceJackson:看起来你是对的。我重建了页面,它工作。请参阅下面的答案。 – RationalGeek 2010-11-12 13:17:46

回答

0

我真的不知道发生了什么。基于@ TerenceJackson的评论说,它为他工作,我完全重建有问题的页面和VM代码,并一切工作。我仔细看了两段代码,找出不同的地方,但我不知道。所以尽管它让我感到不安,但我将不得不继续前进。我想我会围绕这个问题留下一个问题,那就是某个人有同样的问题,并且实际上找出了原因。

3

元素绑定不限于“控件”。您可以尝试绑定到LayoutRoot的元素,因为它仅在当前作用域中的名称在运行时解析。

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

例如

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

如果绑定仍然不火也将是该CheckBoxColumn的特征/缺陷(例如,它拿起从该行的数据上下文值)

相关问题