2012-01-24 37 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>