2012-01-24 40 views
0

我從Silverlight中的數據網格調用方法時遇到了mvvm問題。 我想爲每行的屬性更改事件註冊一個觸發器。Silverlight 4 - 在MVVM模式中從DataGrid調用方法

問題: - 綁定的方法到另一個數據上下文(myMVVM),而不是到myEntity所對象 - 獲取儘可能多的信息可能喜歡的DataItem,通話和財產並將其傳遞到OnPropertyChanged

任何想法?

這是我想什麼有:

<Grid DataContext="{Binding myMVVM}"> 
     <data:DataGrid ItemsSource="{Binding MyCollection}"> 
      <data:DataGrid.Columns> 
       <data:DataGridTextColumn Binding="{Binding Text}"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="PropertyChanged"> 
          <i:CallMethodAction TargetObject="{Binding}" Method="OnPropertyChanged"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </data:DataGridTextColumn> 
       <data:DataGridTextColumn Binding="{Binding Text2}" /> 
       <data:DataGridTextColumn Binding="{Binding Text3}" /> 
       <data:DataGridTextColumn Binding="{Binding Text4}" /> 
       <data:DataGridTextColumn Binding="{Binding Text5}" /> 
      </data:DataGrid.Columns> 
     </data:DataGrid>  
    </Grid> 





public class MyMVVM { 

    public System.Collections.Generic.List<MyEntry> MyCollection { get; set; } 

    public void OnPropertyChanged(object sender, MyEventArgs ea) { 
     DataGrid mySender = (DataGrid)sender; 
     MyEntry dataItem = ea.DataItem; 
     string propertyName = ea.PropertyName; 
    } 
} 


public class MyEntry : System.ComponentModel.INotifyPropertyChanged { 
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
    private string _text; 

    public string Text { 
     get { return _text; } 
     set { 
      _text = value; 
      RaisePropertyChangedEvent("Text"); 
     } 
    } 

    public string Text2 { get; set; } 
    public string Text3 { get; set; } 
    public string Text4 { get; set; } 
    public string Text5 { get; set; } 

    public void RaisePropertyChangedEvent(string propname) { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propname)); 
     } 
    } 
} 

回答

0

在XAML中,要在該DataGridTextColumn PropertyChanged事件作出迴應。 不幸的是,DataGridTextColumn沒有事件。

如果您想響應單元格中的更改,建議將行爲直接設置到DataGrid。這提供了CellEditEnded事件。

這裏的解決方案:

<UserControl.Resources> 
    <ViewModel:MyViewModel x:Key="myViewModel"/> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource SampleDataSource}}"> 
    <sdk:DataGrid d:LayoutOverrides="Width" AutoGenerateColumns="False" ItemsSource="{Binding Collection}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="CellEditEnded"> 
     <ei:CallMethodAction TargetObject="{StaticResource myViewModel}" MethodName="OnPropertyChanged" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

    <sdk:DataGrid.Columns> 
     <sdk:DataGridTextColumn Binding="{Binding Text}" Header="Text"/> 
     <sdk:DataGridTextColumn Binding="{Binding Text2}" Header="Text2"/> 
     <sdk:DataGridTextColumn Binding="{Binding Text3}" Header="Text3"/> 
     <sdk:DataGridTextColumn Binding="{Binding Text4}" Header="Text4"/> 
     <sdk:DataGridTextColumn Binding="{Binding Text5}" Header="Text5"/> 
    </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 
</Grid>