【问题标题】:Notify ViewModel on change in static Model [duplicate]通知 ViewModel 更改静态模型 [重复]
【发布时间】:2013-06-03 18:58:44
【问题描述】:

我正在设计一个LogManager 类来处理我的应用程序中的所有日志,以LogMessage 对象的形式。它们保存在班级的ObservableCollection 中。 LogManager 本身是静态的,可以在我的程序的每个部分进行访问。

现在我想创建一个View,它可以显示LogMessagesObservableCollection,但我不知道如何通知ViewModel 添加了一个新的LogMessage ...

我尝试实现INotifyPropertyChanged,但由于该类是静态的,这是不可能的。

PS:我正在为我的应用程序使用 MVVM-Light 工具包

【问题讨论】:

  • 我很确定你可以绑定静态属性。 AFAIK,{ Binding Source = { x:Static YourClass.Property... 应该可以工作。我记得我在玩 wpf 时读过类似的东西,不确定 btw
  • 是的,我是对的:stackoverflow.com/a/9500648/1283847 这是重复的,顺便说一句。
  • @PLB:这可能行得通,但是我宁愿将集合保存在我的ViewModel 中,因为我希望能够将它存储在另一个ObservableCollection 中,这样我就可以清除视图中的日志,但不在LogManager

标签: c# wpf mvvm-light


【解决方案1】:

您应该考虑LogManager 的责任。真的需要实现INotifyPropertyChanged吗?

您可以在 XAML 中为 LogManager 使用 StaticResource 或在 View 的 ViewModel 中为其提供属性。

视图模型:

//Placeholder class
public static class LogManager
{
    public static ObservableCollection<LogMessage> Messages { get; }
}

public class LogMessage
{
    public string Text { get; set; } 
}

public class LogManagerViewModel
{
    public ObservableCollection<LogMessage> Messages { get { return LogManager.Messages; } }
}

XAML:

<ListBox ItemsSource="{Binding Messages}" DisplayMemberPath="Text" />

也就是说,我建议考虑使用 MvvmLight 的内置依赖注入功能并使 LogManager 非静态。

【讨论】:

  • 我在做完全相同的事情,我认为它不起作用,因为我在 ListBox 中没有看到任何内容,然后我阅读了您的答案,我意识到我没有设置 DisplayMemberPath 属性.. 愚蠢的我!感谢您让我意识到,这肯定会让我过一段时间才能找到自己
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2023-04-02
  • 2012-11-14
  • 2011-11-03
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多