在WPF中从静态变量迁移到Singleton

时间:2016-06-01 02:58:34

标签: c# wpf static singleton

我会保持简短的问题,因为我更愿意自己理解并实施,但如果您愿意,可以提供更多信息/代码。

我正在开发一个WPF应用程序来创建一个简单的Expense Tracker。现在我有一个XAML页面显示一个名为ExpenseEntry的对象的Observable Collection,后者又有四个元素:EntryDate,EntryCategory,EntryAmount和EntryComment。所有这四个,以及TempExpenseEntry和ExpenseList(Observable Collection)都声明是在页面的ViewModel.cs中使用private _variable,public变量(get; set)声明的,并且代码按照我希望的方式工作我要添加和组织条目。我还有一个名为EntryTotal的浮点数,它会在添加新条目时汇总所有EntryAmounts。

现在我想添加另一页进行分析。最终会有很多花里胡哨的东西但是现在我希望它只是容纳一个名为CategoryList的单独的Observable Collection,它可以观察/订阅第1页中的事件,并在添加新条目时执行一些操作。具体而言,该操作将检查是否存在CategoryName。如果是,则将CategoryAmount添加到总计中,如果不是,则将新条目添加到列表中。

对网站的研究以及与比我更了解情况的人进行咨询,这使得我使用单身人士这样的两个页面'视图模型可以看到ExpenseList。我找到了一个关于创建Singleton实例的教程,但找不到如何从我在Page 1的View Model上声明的公共/私有元素转移到Singleton共享多个页面的指南。应该在Singleton中实例化TempExpenseEntry和ExpenseList吗? CategoryList怎么样?这些变量是否在Singleton类中以相同的方式声明?第1页和第2页只有Singleton的实例吗?页面特定方法和事件订阅应该在哪里?

我非常感谢社群对此提出的一些指导。我喜欢四处寻找并通过自己的工作来学习具体细节,但是我可以在正确的方向上轻松推动。

希望收到你的来信,

Yusif Nurizade

1 个答案:

答案 0 :(得分:-1)

如果没有一些代码,我很难帮助你(我觉得代码很复杂,这就是为什么你没有发布它),但无论如何,我建议你得到所有来自Page1的静态代码,并将其放入一个新类(我们称之为类A)但作为非静态代码。现在你要做的就是让类A成为一个单例,任何东西都能够访问数据。

<强>更新

行。考虑到你的评论然后我会做这样的事情:

public class Singleton : DependencyObject, INotifyPropertyChanged
{
    private static Singleton _Instance;
    public static Singleton Instance
    {
        get
        {
            if (_Instance == null)
                _Instance = new Singleton();
            return _Instance;
        }
    }

    //Dependency Property    
    public static readonly DependencyProperty PropertyA = DependencyProperty.Register("A", typeof(string), typeof(Singleton));
    public string A
    {
        get { return GetValue(PropertyA).ToString(); }
        set { SetValue(PropertyA, value); }
    }

    //Property
    private int _B;
    public int B
    {
        get { return _B; }
        set
        {
            _B = value;
            RaisePropertyChanged("B");
        }
    }

    static Singleton()
    {
        Instance = new Singleton();
    }

    //INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new new PropertyChangedEventArgs(propertyName));
    }
}

在这个课程中,您现在可以放置所有私有/公共属性。我甚至从DependencyObject继承,以防你有DependencyProperties

然后在你的XAML上,你可以像这样绑定:

<TextBlock Text="{Binding Source={x:Static Singleton.Instance}, Path=A}"/>

OR

<TextBlock Text="{Binding Source={x:Static Singleton.Instance}, Path=B}"/>