【问题标题】:MVVM viewmodel events (commands?)MVVM 视图模型事件(命令?)
【发布时间】:2012-02-22 02:18:50
【问题描述】:

我有一个 MVVM 设置,可以在我的 MainWindow 上创建一个视图。我不确定如何知道用户何时单击视图中的特定通知项。我应该在哪里添加事件或命令以知道何时发生?

这是我的 MVVM 代码:

主窗口

cs:

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

xaml:

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

通知模型

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
}

通知视图模型

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);
    }
}

通知视图

<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>

【问题讨论】:

    标签: c# wpf mvvm itemssource


    【解决方案1】:

    ItemsControl 中没有内置真正的选择机制。将ItemsControl 换成ListBox 可能会解决您的问题。

    如果这样做,您可以绑定到SelectedItem,然后使用PropertyChanged 事件处理对SelectedItem 所做的任何更改。

    例子:

    在您的视图模型的构造函数中:

    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 中的属性。

    【讨论】:

    • 谢谢。但是,我将 SelectedNotification 从 type(string) 更改为 type(int),然后可以将其绑定到我的 NotificationListBoxSelectedIndex。然后我使用这个SelectedIndex 作为我的ObservableCollection&lt;NotficationModel&gt; Notifications 中的索引。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2011-03-01
    • 2011-09-13
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多