События MVVM viewmodel (команды?) - PullRequest
1 голос
/ 22 февраля 2012

У меня есть настройка MVVM, которая создает представление в моем главном окне.Я не уверен, как узнать, когда пользователь нажимает на определенный элемент уведомления в представлении.Куда мне добавить событие или команду, чтобы узнать, когда это произойдет?

Вот мой код MVVM:

MainWindow

cs:

NotificationViewModel notificationViewModel = new NotificationViewModel();
notificationViewModel.AddNoticiation(new NotificationModel() { Message = "Error", Name = "Station 21" });
NotificationView.DataContext = notificationViewModel;

xaml:

<notification:NotificationView x:Name="NotificationView" />

NotificationModel

public class NotificationModel : INotifyPropertyChanged
{

    private string _Message;
    public string Message
    {
        get { return _Message; }
        set
        {
            if (_Message != value)
            {
                _Message = value;
                RaisePropertyChanged("Message");
            }
        }
    }

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            if (_Name != value)
            {
                _Name = value;
                RaisePropertyChanged("Name");
            }
        }
    }

    public string TimeStamp
    {
        get { return DateTime.Now.ToString("h:mm:ss"); }
    }

    #region PropertChanged Block
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
    #endregion
}

NotificationViewModel

public class NotificationViewModel 
{
    private ObservableCollection<NotificationModel> _Notifications = new ObservableCollection<NotificationModel>();
    public ObservableCollection<NotificationModel> Notifications 
    { 
        get { return _Notifications; } 
        set { _Notifications = value; } 
    }

    public void AddNoticiation(NotificationModel notification)
    {
        this.Notifications.Insert(0, notification);
    }
}

NotificationView

<Grid>
    <StackPanel HorizontalAlignment="Left" >
        <ItemsControl ItemsSource="{Binding Path=Notifications}"
                      Padding="5,5,5,5">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border Background="SlateGray"
                            CornerRadius="4">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="100" />
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" 
                                       Text="{Binding Path=TimeStamp}" />
                            <TextBlock Grid.Column="1" 
                                       Text="{Binding Path=Name}" />
                            <TextBlock Grid.Column="2" 
                                       Text="{Binding Path=Message}" />
                        </Grid>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Grid>

1 Ответ

0 голосов
/ 22 февраля 2012

Нет реального механизма выбора, встроенного в ItemsControl.Вероятно, это решило бы вашу проблему для замены ItemsControl на ListBox.

. Если вы сделаете это, вы можете привязать к SelectedItem, а затем обработать любые изменения, сделанные в SelectedItem, используя PropertyChanged event.

Пример:

В конструкторе модели вашего представления:

PropertyChanged += NotificationViewModel_PropertyChanged;

Добавьте свойство в модель представления, чтобы разрешить привязку:

private string _selectedNotification;
public string SelectedNotification
{
    get { return _selectedNotification; }
    set
    {
        if (_selectedNotification != value)
        {
            _selectedNotification = value;
            RaisePropertyChanged("SelectedNotification");
        }
    }
}

Наконец, добавьте обработчик событий в вашу модель представления:

NotificationViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e))
{
    if (e.PropertyName = "SelectedNotification") DoStuff();
}

Вы можете обнаружить, что вам даже не нужно подключаться к PropertyChanged, если вы просто хотите обновить другой элемент управления в вашемпросматривать на основе выбранного элемента в списке.Вы можете просто привязать непосредственно к собственности в XAML.

...