C# 使或声明ObservableCollection变量为全局变量,其中a=匿名类型
我想将listview datacontext设置为一个可观察的集合,以便集合的更改可以反映在我的listview上。我创建的可观察集合如下所示:C# 使或声明ObservableCollection变量为全局变量,其中a=匿名类型,c#,observablecollection,datacontext,C#,Observablecollection,Datacontext,我想将listview datacontext设置为一个可观察的集合,以便集合的更改可以反映在我的listview上。我创建的可观察集合如下所示: public static ObservableCollection<T> ToObservableCollection<T>(IEnumerable<T> enumeration) { return new ObservableCollection<T>(enumeration); } p
public static ObservableCollection<T> ToObservableCollection<T>(IEnumerable<T> enumeration)
{
return new ObservableCollection<T>(enumeration);
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Entities.DatabaseModel m = new Entities.DatabaseModel();
var q = from t in m.TimeSheet
join emp in m.Employees on t.idEmployee equals emp.id
where emp.id == CurrentEmploye.id
select new
{
firstName = emp.firstName,
lastName = emp.lastName,
position = emp.position,
clockInDate = t.clockInDate,
clockOutDate = t.clockOutDate,
};
// here I create the observablecollection!!!!!!!!!!!!!!
listView1.DataContext = ToObservableCollection(q);
}
这是我尝试过的,但不起作用:
dynamic collection;
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
// CurrentEmploye some employee
Entities.DatabaseModel m = new Entities.DatabaseModel();
var q = from t in m.TimeSheet
join emp in m.Employees on t.idEmployee equals emp.id
where emp.id == CurrentEmploye.id
select new
{
firstName = emp.firstName,
lastName = emp.lastName,
position = emp.position,
clockInDate = t.clockInDate,
clockOutDate = t.clockOutDate,
};
collection = ToObservableCollection(q);
}
private void btnClockIn_Click(object sender, RoutedEventArgs e)
{
collection.Add(new
{
firstName = "Antonio",
lastName = "Nam",
position = "Amin",
clockInDate = DateTime.Now,
clockOutDate = DateTime.Now
});
您可以使用类似的“模板”匿名变量来“欺骗”它。。。 e、 代码方法类似于
static ObservableCollection<T> CastToEnumerable<T>(this T template, object value)
{
return (ObservableCollection<T>)value;
}
…出于您的目的,仍然建议使用普通的命名类。
你可以在这里找到更多关于类似问题的信息。。。
基本上,你不能返回匿名类型——除了像这样的技巧之外——“推断”类型就是背后的原因 您可以使用类似的“模板”匿名变量来“欺骗”它。。。 e、 代码方法类似于
static ObservableCollection<T> CastToEnumerable<T>(this T template, object value)
{
return (ObservableCollection<T>)value;
}
…出于您的目的,仍然建议使用普通的命名类。
你可以在这里找到更多关于类似问题的信息。。。
基本上,你不能返回匿名类型——除了像这样的技巧之外——“推断”类型就是背后的原因 在不能使用类型推断的地方使用匿名类型是不可能的,因此,例如,不能声明匿名类型的类字段或属性。然而,有一种不明显的方法是使用类型推断,它允许您跨方法共享匿名对象 正如我在评论中提到的,最简单的选择是只使用命名类型;这将允许您将ObservableCollection定义为类级变量,或在类中的其他位置对DataContext进行类型转换 根据您需要使用此代码的频率,还有第二个选项涉及将对象类型转换为匿名类型。这要求您知道,在每个要使用匿名类型的地方,它的字段顺序是什么。它还要求匿名类型的每次使用都存在于同一程序集中——这保证了编译器将匿名类型统一到一个底层类型中 如果符合您的要求,您可以使用以下技巧:
ObservableCollection<T> Cast<T>(object obj, T typedobj)
{
return (ObservableCollection<T>)obj;
}
private void btnClockIn_Click(object sender, RoutedEventArgs e)
{
var temp = new
{
firstName = string.Empty,
lastName = string.Empty,
position = string.Empty,
clockInDate = DateTime.Min,
clockOutDate = DateTime.Now
};
var collection = Cast(lstView1.DataContext, temp);
collection.Add(...);
}
让我重复一遍,这是一个有点混乱的技巧,它利用了C如何实现匿名类型的一个模糊细节。这本身并不是一个黑客行为,因为行为是由规范保证的,但这在多大程度上是有严格限制的。如果您只有一个或两个这样的集合,我肯定会倾向于给您的类型命名。在无法使用类型推断的地方使用匿名类型是不可能的,因此您不能(例如)声明匿名类型的类字段或属性。然而,有一种不明显的方法是使用类型推断,它允许您跨方法共享匿名对象 正如我在评论中提到的,最简单的选择是只使用命名类型;这将允许您将ObservableCollection定义为类级变量,或在类中的其他位置对DataContext进行类型转换 根据您需要使用此代码的频率,还有第二个选项涉及将对象类型转换为匿名类型。这要求您知道,在每个要使用匿名类型的地方,它的字段顺序是什么。它还要求匿名类型的每次使用都存在于同一程序集中——这保证了编译器将匿名类型统一到一个底层类型中 如果符合您的要求,您可以使用以下技巧:
ObservableCollection<T> Cast<T>(object obj, T typedobj)
{
return (ObservableCollection<T>)obj;
}
private void btnClockIn_Click(object sender, RoutedEventArgs e)
{
var temp = new
{
firstName = string.Empty,
lastName = string.Empty,
position = string.Empty,
clockInDate = DateTime.Min,
clockOutDate = DateTime.Now
};
var collection = Cast(lstView1.DataContext, temp);
collection.Add(...);
}
让我重复一遍,这是一个有点混乱的技巧,它利用了C如何实现匿名类型的一个模糊细节。这本身并不是一个黑客行为,因为行为是由规范保证的,但这在多大程度上是有严格限制的。如果你只有一两个这样的集合,我肯定会倾向于给你的类型命名。你真的需要匿名类型吗?查询是否会返回与您指定的字段不同的字段?您是对的,我只是想节省时间,因为我在其他地方需要此功能,但最终可能会浪费更多时间。您有一些选项,使用命名类型是最快的。我将发布一个更详细的答案。可能是的副本。你绝对需要匿名类型吗?查询是否会返回与您指定的字段不同的字段?您是对的,我只是想节省时间,因为我在其他地方需要此功能,但最终可能会浪费更多时间。您有一些选项,使用命名类型是最快的。我将发布一个更详细的答案。该方法可能重复:ObservableCollection Castobject obj,T typedobj给我一个编译错误,上面说:无法将类型“T”转换为“System.Collections.ObjectModel.ObservableCollectionyeah,我的答案中有输入错误,抱歉。键入错误的参数。现在已修复。虽然我更喜欢扩展方法版本:只是风格问题:我不会仅仅因为这个就发布我的答案,但我们会
几乎是在同一时间,这仍然是一个'黑客',无论我们怎么说,更有趣的编码不知道;C规范明确保证了这一点,这使得我更可能使用它,而不是依赖GetHashCode的实现。方法:ObservableCollection Castobject obj,T typedobj给我一个编译错误,说:无法将类型“T”转换为“System.Collections.ObjectModel.ObservableCollectionyeah,对不起,我的答案错了。键入错误的参数。现在修复了。虽然我更喜欢扩展方法版本:只是风格问题:我不会仅仅因为这个就发布我的答案,但我们几乎同时发布了——不管我们怎么说,这仍然是一个“黑客”,更有趣的编码我不知道;C规范明确保证了这一点,这一事实使我更有可能使用它,比如说,依赖GetHashCode的实现,我没有意识到可以向泛型类型添加扩展方法,这太棒了。你可以用静态方法做任何你能做的事情,你可以使方法与类一样通用-只需在第一个参数中添加“this”-虽然有点简化。没有意识到你可以将扩展方法添加到泛型类型中,这太棒了。你可以用静态方法做任何你能做的事情,你可以让方法和类一样通用——只需在第一个参数中加上“this”——虽然有点简化。