【发布时间】:2016-12-21 18:52:33
【问题描述】:
大家好,
我的程序中出现了一个小问题,这让我非常烦恼。
这里是我在程序中使用的单例类。
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
}
我使用这些 Candidate/Enterprise/...-Objects 作为我的 ComboBoxes 的 ItemSource,这非常有效。 为了在其他视图模型中使用这些对象,我想将它们保存到单例类中,从那里我想将它们加载到所有其他视图模型中。
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;
}
例如,这是我在程序中使用的组合框之一。
<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>
SaveView 方法如下所示
public void SaveView()
{
Resources.Instance.Candidate = Candidate;
Resources.Instance.Enterprise = Enterprise;
Resources.Instance.WikomContact = WikomContact;
}
RefreshView 方法也会在表单加载时触发。 问题是,组合框从数据库中获得了正确的输入,但是如果我选择其中一个,然后更改视图并再次加载它,则 SelectedValue 不是我之前输入的...
有谁知道我做错了什么?或者谁能告诉我为什么我的“想法/方法”不起作用?
抱歉英语不好,我通常说德语! ;)
【问题讨论】:
-
我不明白:你从来没有使用过
Resources的单例实例,只是它的静态属性。为什么不直接将Resources设为静态? -
哦,是的,我明白了……我对单例并不熟悉,这就是我在这里的原因;)我现在将其更改为单例的实例,但它仍然无法正常工作。 ..还有什么想法吗?
-
你根本不需要
public static Resource Instance。将Resource声明为静态类并像以前一样访问属性:例如,Resource.Candidate。 -
您的代码不会像编写的那样编译,因为
Candidate是一个类名,而不是Candidate类型的值(Resources.Instance.Candidate = Candidate)。更新代码后,请编辑您的帖子。 -
我的房产也被称为“候选人”! ;) 这很糟糕吗?这可能是我的错误吗?等待我尝试重命名它们! :o //edit: 试图重命名我的属性,但效果不佳 -> 这不是我的错误...还有什么想法吗? :(@Kjata30
标签: c# wpf view singleton viewmodel