我当前的应用程序中存在以下问题。(类示例应理解为 Entity Framework 实体类。)
让我们假设您有一个包含一些属性的静态类,这些属性在应用程序范围内用作各种 Get/Set 属性的示例。
每次您请求此属性时都会调用该属性的 Get,并且每次对控件进行重绘(布局刷新)时,都会对某些控件进行数据绑定。
现在我面临的问题是,我希望打开 2 个具有不同“静态”值的窗口,实现这种情况的最佳方法是什么?
这里有一些代码可能会让事情更容易理解:
静态类,包含查询中使用的属性:
public static class Core
{
public string IdLang { get; set; }
public string IdCompany { get; set; }
}
在属性名称的 get/set 中使用 Core.IdLang 的类:
public class Car
{
private string _name;
public string Name
{
get
{
_name = (from x in LanguageTables
where x.IdLang == Core.IdLang
select x.Text).FirstOrDefault();
return _name;
}
set
{
if (value == _name)
return;
var languageTable = (from x in LanguageTables
where x.IdLang == Core.IdLang
select x).FirstOrDefault();
if (languageTable == null)
{
languageTable = new LanguageTable();
languageTable.IdLang = Core.IdLang;
}
languageTable.Text = _name;
}
}
}
现在让我们假设您在 2 个不同的窗口中有 2 个 DataGrid,并且想要绑定具有两种不同语言的汽车列表。
我正在执行以下操作(仅适用于 1 个网格和窗口的示例):
public class Window1 : Window
{
List<Car> Cars;
public Window1()
{
InitializeComponents();
Core.IdLang = "DE";
Cars = new List<Car>();
//fetch data from Database, and populate the List<Car>
Grid1.ItemsSource = from x in Cars
select x;
}
}
现在只需考虑复制并粘贴上面的代码(Window1)并有第二个窗口并希望显示所有带有英文名称的汽车,所以我更改了以下代码:
Core.IdLang = "DE";
至
Core.IdLang = "EN";
并认为一切都会好起来的,但是无论您以后调用什么窗口,Core.IdLang 现在都具有此值,并且一旦在任一窗口上调用 Get/Set,您将只能以这种语言接收或更改它,并且在窗口之间没有区别。
在现实生活中的应用程序中,Core 类将包含大约 6 个(或更多)属性,这些属性在 50 多个类中使用,这些类都具有至少一个具有相同 get/set 代码的属性,正如您在 Car.Name 示例中看到的那样。
这些类中的任何一个都可以在提供的场景中使用,我想将英语和德语数据并排显示以进行比较。