【问题标题】:Silverlight 4 - Calling Method from DataGrid in MVVM-PatternSilverlight 4 - 从 MVVM 模式中的 DataGrid 调用方法
【发布时间】:2012-01-24 12:09:49
【问题描述】:

我在 silverlight 中从数据网格调用方法时遇到了 mvvm 问题。 我想为每一行的属性更改事件注册一个触发器。

问题: - 将方法绑定到另一个数据上下文 (myMVVM) 而不是 MyEntity 对象 - 尽可能多地获取数据项、调用和属性等信息并将其传递给 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));
        }
    }
}

【问题讨论】:

    标签: silverlight datagrid methods


    【解决方案1】:

    在 XAML 中,您希望响应 DataGridTextColumn 处的 PropertyChanged 事件。 不幸的是,DataGridTextColumn 没有事件。

    如果要响应单元格的变化,建议直接将 Behavior 设置为 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2011-02-21
      • 2011-12-24
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多