C# 如何保存/加载视图/单例类的属性

C# 如何保存/加载视图/单例类的属性,c#,wpf,view,singleton,viewmodel,C#,Wpf,View,Singleton,Viewmodel,嘿,伙计们 我现在在我的程序中有一个小问题,这让我非常困扰 这里是我在程序中使用的单例类 public class Resources { private static Resources _instance; public static Resources Instance { get { return _instance ?? (_instance = new Resources()); } } #region Properties

嘿,伙计们

我现在在我的程序中有一个小问题,这让我非常困扰

这里是我在程序中使用的单例类

public class Resources
{
    private static Resources _instance;

    public static Resources Instance
    {
        get { return _instance ?? (_instance = new Resources()); }
    }

    #region Properties

    public Candidate Candidate { get; set; }
    public Enterprise Enterprise { get; set; }
    public WikomContact WikomContact { get; set; }
    public AMSContact AMSContact { get; set; }

    #endregion
}
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="170" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Label Content="Enterprise" Margin="3" Foreground="White" Grid.Column="0"/>
    <ComboBox ItemsSource="{Binding EnterpriseList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                              SelectedItem="{Binding Enterprise, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                              DisplayMemberPath="Name" 
                              IsEditable="True"
                              IsEnabled="{Binding EnterpriseIsEnabled, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                              Margin="3" Grid.Column="1">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding RefreshViewCommand, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ComboBox>
</Grid>
我使用这些候选/Enterprise/…-对象作为组合框的ItemSources,这非常有效。 为了在其他ViewModel中也使用这些对象,我想将它们保存到一个Singleton类中,从那里我想将它们加载到所有其他ViewModel中

public _0InfoTalkViewModel()
{
    _context = new WikomContext();
    RefreshViewCommand = new RelayCommand(RefreshView);
    PrintViewCommand = new RelayCommand(PrintView);
    SaveViewCommand = new RelayCommand(SaveView);
    EnterpriseIsEnabled = false;
    WikomContactIsEnabled = true;

    Candidate = Resources.Instance.Candidate;
    Enterprise = Resources.Instance.Enterprise;
    WikomContact = Resources.Instance.WikomContact;
}
下面是我在程序中使用的一个组合框

public class Resources
{
    private static Resources _instance;

    public static Resources Instance
    {
        get { return _instance ?? (_instance = new Resources()); }
    }

    #region Properties

    public Candidate Candidate { get; set; }
    public Enterprise Enterprise { get; set; }
    public WikomContact WikomContact { get; set; }
    public AMSContact AMSContact { get; set; }

    #endregion
}
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="170" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Label Content="Enterprise" Margin="3" Foreground="White" Grid.Column="0"/>
    <ComboBox ItemsSource="{Binding EnterpriseList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                              SelectedItem="{Binding Enterprise, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                              DisplayMemberPath="Name" 
                              IsEditable="True"
                              IsEnabled="{Binding EnterpriseIsEnabled, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                              Margin="3" Grid.Column="1">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding RefreshViewCommand, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ComboBox>
</Grid>
在加载表单时也会触发RefreshView方法。 问题是,组合框从数据库获得正确的输入,但如果我选择其中一个,然后更改视图并再次加载,则SelectedValue不是我之前输入的值

有人知道我做错了什么吗?或者有人能告诉我为什么我的“想法/方法”不起作用吗

对不起,英语不好,我通常说德语

Snaylor

您的属性不应该是静态的,它们应该是实例属性:

public Candidate Candidate { get; set; }
public Enterprise Enterprise { get; set; }
public WikomContact WikomContact { get; set; }
public AMSContact AMSContact { get; set; }
引用singleton资源时,它应该是对实例的引用:

Candidate = Resources.Instance.Candidate;
Resources.Instance.Candidate = Candidate;

我不明白:您从未使用过
资源
的单例实例,只是它的静态属性。为什么不把
资源
变成静态的呢?哦,是的,我明白了。。。我对单身汉不太熟悉,这就是我来这里的原因;)我现在把它改成了一个单例实例,但它仍然不起作用。。。还有什么想法吗?您根本不需要
公共静态资源实例
。将
Resource
声明为静态类,并按原样访问属性:
Resource.Candidate
。例如,由于
Candidate
是一个类名,而不是
Candidate
类型的值(位于
Resources.Instance.Candidate=Candidate
),因此您的代码不会按编写的方式编译。更新代码后,请编辑您的帖子。我的属性也被称为“候选者”;)这不好吗?这可能是我的错吗?等等,我试着给他们重新命名o//edit:尝试重命名我的属性,但效果不好->这不是我的错误。。。还有什么想法吗(@kjata30ah好的,很高兴知道,是的,我对单例不太熟悉…我现在把它改成了实例,但它仍然不起作用…还有其他想法吗?:o@Ibrahim Malluf你把你的属性从静态改成了我在代码中展示给你的实例了吗?很抱歉,我没有看到你的帖子,是的,我这样做了,仍然不起作用…我请重新阅读您的帖子,如果我现在理解正确的话,您希望您的单例类能够在不同的请求之间存活下来。这不会发生,因为状态未保存。您需要一种方法在请求之间保持状态。是的,我昨天已经解决了这个问题,我遇到了从我的viewmodel中的singleton类。我已将您的答案标记为“已接受”!感谢您的帮助!:)