Silverlight 4 - вызов метода из DataGrid в MVVM-шаблоне - PullRequest
0 голосов
/ 24 января 2012

У меня проблема с mvvm при вызове методов из сетки данных в silverlight. Я хотел бы зарегистрировать триггер для события измененного свойства для каждой строки.

Проблемы: - Привязка метода к другому контексту данных (myMVVM), а не к объекту MyEntity - Получите как можно больше информации, например dataItem, call и property, и передайте ее 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));
        }
    }
}

1 Ответ

0 голосов
/ 24 января 2012

В XAML вы хотите ответить на событие PropertyChanged в DataGridTextColumn.К сожалению, 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...