2010-11-11 72 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的特徵/缺陷(例如,它拿起從該行的數據上下文值)

相關問題