如何 save/load 属性 from/to 一个 View/Singleton-Class
How to save/load Properties from/to a View/Singleton-Class
大家好,
我的程序现在有一个小问题,这让我很困扰。
这里是我在程序中使用的 Singleton-class。
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 的 ItemSources,这工作得很好。
为了在其他视图模型中也使用这些对象,我想将它们保存到 Singleton-class,从那里我想将它们加载到所有其他视图模型中。
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 方法。
问题是,组合框从数据库中获得了正确的输入,但是如果我 select 其中之一,然后更改视图并再次加载它,则 SelectedValue 不是我之前输入的那个 ...
有谁知道我做错了什么?或者谁能告诉我为什么我的 "idea/method" 不起作用?
抱歉英语不好,我通常说德语! ;)
斯奈勒;
您的属性不应该是静态的,它们应该是实例属性:
public Candidate Candidate { get; set; }
public Enterprise Enterprise { get; set; }
public WikomContact WikomContact { get; set; }
public AMSContact AMSContact { get; set; }
当你引用你的单例时,资源应该是对实例的引用:
Candidate = Resources.Instance.Candidate;
Resources.Instance.Candidate = Candidate;
大家好,
我的程序现在有一个小问题,这让我很困扰。
这里是我在程序中使用的 Singleton-class。
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 的 ItemSources,这工作得很好。 为了在其他视图模型中也使用这些对象,我想将它们保存到 Singleton-class,从那里我想将它们加载到所有其他视图模型中。
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 方法。 问题是,组合框从数据库中获得了正确的输入,但是如果我 select 其中之一,然后更改视图并再次加载它,则 SelectedValue 不是我之前输入的那个 ...
有谁知道我做错了什么?或者谁能告诉我为什么我的 "idea/method" 不起作用?
抱歉英语不好,我通常说德语! ;)
斯奈勒;
您的属性不应该是静态的,它们应该是实例属性:
public Candidate Candidate { get; set; }
public Enterprise Enterprise { get; set; }
public WikomContact WikomContact { get; set; }
public AMSContact AMSContact { get; set; }
当你引用你的单例时,资源应该是对实例的引用:
Candidate = Resources.Instance.Candidate;
Resources.Instance.Candidate = Candidate;