7

Có cách nào để tạo mẫu dữ liệu xử lý danh sách các mục không?DataTemplate.DataType = Collection <Entity>?

Tôi có Contact.Phones (EntityCollection<Phone>) và tôi muốn các mẫu dữ liệu để xử lý danh sách - thêm remove chỉnh sửa, vv

Có cách nào để thiết lập thuộc tính DataType của DataTemplate để generic EntityCollection<Phone>?

Trả lời

3

Đưa danh sách chung của bạn vào một lớp mới, lớp này sẽ phân loại danh sách chung của bạn mà không thêm bất kỳ thứ gì. Điều này làm cho nó có thể liên kết với danh sách từ XAML. Điều này được mô tả tại đây: Can I specify a generic type in XAML (pre .NET 4 Framework)?

7

Trong công cụ Emerald Data Foundation (EDF) của tôi, tôi đã giải quyết vấn đề này bằng cách tạo một MarkupExtension mạnh hơn x: Loại có thể chỉ định các loại chung. Bằng cách đó tôi có thể viết:

<DataTemplate TargetType="{edf:Type generic:ICollection{local:Entity}}" /> 

Đây là những gì tôi đã sử dụng:

[MarkupExtensionReturnType(typeof(Type))] 
    public class TypeExtension : MarkupExtension 
    { 
    public TypeExtension() { } 
    public TypeExtension(string typeName) { TypeName = typeName; } 
    public TypeExtension(Type type) { Type = type; } 

    public string TypeName { get; set; } 
    public Type Type { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if(Type==null) 
     { 
     IXamlTypeResolver typeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver; 
     if(typeResolver==null) throw new InvalidOperationException("EDF Type markup extension used without XAML context"); 
     if(TypeName==null) throw new InvalidOperationException("EDF Type markup extension used without Type or TypeName"); 
     Type = ResolveGenericTypeName(TypeName, (name) => 
     { 
      Type result = typeResolver.Resolve(name); 
      if(result==null) throw new Exception("EDF Type markup extension could not resolve type " + name); 
      return result; 
     }); 
     } 
     return Type; 
    } 

    public static Type ResolveGenericTypeName(string name, Func<string, Type> resolveSimpleName) 
    { 
     if(name.Contains('{')) 
     name = name.Replace('{', '<').Replace('}', '>'); // Note: For convenience working with XAML, we allow {} instead of <> for generic type parameters 

     if(name.Contains('<')) 
     { 
     var match = _genericTypeRegex.Match(name); 
     if(match.Success) 
     { 
      Type[] typeArgs = (
      from arg in match.Groups["typeArgs"].Value.SplitOutsideParenthesis(',') 
      select ResolveGenericTypeName(arg, resolveSimpleName) 
      ).ToArray(); 
      string genericTypeName = match.Groups["genericTypeName"].Value + "`" + typeArgs.Length; 
      Type genericType = resolveSimpleName(genericTypeName); 
      if(genericType!=null && !typeArgs.Contains(null)) 
      return genericType.MakeGenericType(typeArgs); 
     } 
     } 
     return resolveSimpleName(name); 
    } 
    static Regex _genericTypeRegex = new Regex(@"^(?<genericTypeName>\w+)<(?<typeArgs>\w+(,\w+)*)>$"); 

    } 

Tên loại generic phân tích code đang trong một phương pháp riêng biệt bởi vì nó cũng được sử dụng bởi một số mã khác trong EDF. Bạn có thể kết hợp tất cả thành một phương pháp.

Các vấn đề liên quan