2013-07-01 4 views
0

나는 상태가 추가, 삭제, 수정 및 취소 된 각 엔터티가있는 관찰 가능한 컬렉션의 엔터티가 있습니다. I 버튼 추가를 선택하면 상태가 추가 된 후, 내 컬렉션은 엔터티를 포함해야필터링 규칙을 기반으로 컬렉션 필터링

  • :

    나는 아래로 내 컬렉션을 필터링한다 클릭 네 개의 버튼 ( 토글 )가 있습니다. I 버튼 삭제 및 추가를 선택하면

  • , 다음 내 컬렉션 상태 추가, 나머지 없음을 가진 상태 삭제와 기관 및 단체를 포함해야합니다.
  • 삭제, 추가 및 수정 단추를 선택한 경우 내 모음에 상태가 삭제됨, 추가 및 수정 된 항목이 포함되어야합니다. . . 곧.
  • 버튼 중 하나를 선택 취소하면 해당 상태의 컬렉션에서 해당 엔티티를 제거해야합니다. 예를 들어 삭제됨을 선택 취소하고 추가 및 수정을 선택하면 내 모음에는 추가 및 수정 됨 상태 및 삭제되지 않은 항목이 있어야합니다. I 마스터 수집 및 필터링 회수를 작성한이 구현

. Filter 컬렉션은 선택 항목과 선택 취소 기준으로 필터링됩니다. 다음은 내 코드입니다 :

private bool _clickedAdded; 
    public bool ClickedAdded 
    { 
     get { return _clickedAdded; } 
     set 
     { 
      _clickedAdded = value; 
      if(!_clickedAdded) 
       FilterAny(typeof(Added)); 

     } 
    } 

    private bool _clickedDeleted; 
    public bool ClickedDeleted 
    { 
     get { return _clickedDeleted; } 
     set 
     { 
      _clickedDeleted = value; 
      if (!_clickedDeleted) 
       FilterAny(typeof(Deleted)); 
     } 
    } 

    private bool _clickedModified; 
    public bool ClickedModified 
    { 
     get { return _clickedModified; } 
     set 
     { 
      _clickedModified = value; 
      if (!_clickedModified) 
       FilterAny(typeof(Modified)); 
     } 
    } 

    private void FilterAny(Type status) 
    { 
     Func<Entity, bool> predicate = entity => entity.Status.GetType() != status; 

     var filteredItems = MasterEntites.Where(predicate); 
     FilteredEntities = new ObservableCollection<Entity>(filteredItems); 
    } 

이 그러나 위의 규칙을 나누기 - 예를 들어 나는 모든 선택한 경우, 다음 나는 그때는 아직 수정 및 취소 추가 된 목록을 보여줍니다 삭제 첨가 한 다음 제거합니다. 필터링 된 컬렉션에서 수정 및 취소되어야합니다.

이 문제를 해결 좀 도와 주시겠습니까? 또한이 문제를 해결하려면 2 가지 목록이 필요합니다. .NET 3.5를 사용하고 있습니다.

+0

내 가정은 당신이 당신의 이전 필터링하여 술어의를 유지하지 않는 것입니다. Filter 메서드에 대한 코드를 추가 할 수 있습니까? 또한 ClickedCancelled가 다른 Click * 메서드와 같은 것으로 가정합니다. – Kevin

+0

예, 취소됨은 동일합니다. 필터 코드는 FilterAny 메소드 내부의 코드입니다. – Mike

+0

** 필터 (typeof (Deleted)); **는 ** private void FilterAny (Type status) ** 메서드를 호출하지 않습니다. ** 그렇게하는 코드를 추가 할 수 있습니까? – Kevin

답변

1

Linq의 확장자가 필요합니다 - http://www.albahari.com/nutshell/predicatebuilder.aspx 이 클래스는 즉시 쿼리를 생성 할 수있는 PredicateBuilder를 제공합니다.

using System; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Collections.Generic; 

public static class PredicateBuilder 
{ 
    public static Expression<Func<T, bool>> True<T>() { return f => true; } 
    public static Expression<Func<T, bool>> False<T>() { return f => false; } 

    public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1, 
                 Expression<Func<T, bool>> expr2) 
    { 
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression>()); 
    return Expression.Lambda<Func<T, bool>> 
      (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters); 
    } 

    public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1, 
                 Expression<Func<T, bool>> expr2) 
    { 
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression>()); 
    return Expression.Lambda<Func<T, bool>> 
      (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); 
    } 
} 

은 그럼 당신은 모든 버튼에 대한의 OnClick 핸들러를 만들고 그 안에 다음과 같은 코드를 삽입

var predicate = PredicateBuilder.False<Entity>(); 

    if(ClickedAdded) 
     predicate = predicate.Or(x=>x.Status == "Added"); 
    if(ClickedDeleted) 
     predicate = predicate.Or(x=>x.Status == "Deleted"); 
    if(ClickedModified) 
     predicate = predicate.Or(x=>x.Status == "Modified"); 

    return masterEntities.AsQueryable().Where(predicate); 
+0

C#의 문자열 형식은'''이 아닌'''을 사용합니다. 좋은 닌자 편집 –

+0

"."요점을 찾아 주셔서 감사합니다. 이 게시물을 읽는 동안 처음으로이 게시물을 읽었 기 때문에 이러한 변경이있었습니다. ( –

+0

니스, 이름 @newStackExchangeInstance –

관련 문제