2013-09-03 3 views
0

У меня есть древовидная структура, которая отображает иерархию объектов типа Company.Определить выбранный tristate

Company имеет (среди прочих) имущество Bool? Checked. Я использую это значение в флажке для каждой строки. Я бы хотел, чтобы флажок (также) указывал, были ли выбраны какие-либо дочерние элементы, но я не уверен, как построить Getter для свойства Checked.

Я думаю, проблема заключается в том, что значение не только отражает текущее значение объектов, но и комбинированное значение дочерних элементов. Разрешено ли мне или нужно переосмыслить?

Example of tristate tree

Это результат я хотел бы получить:

  • Проверено = True (если сам элемент проверяется)
  • Проверено = False (если сам элемент не проверяется И все дети/внуки не проверено)
  • Проверено = Нуль (Если элемент не проверен и НЕКОТОРЫЙ Чайлдс/внуков проверяются)
  • Проверено = Null (если сам элемент не проверен и ВСЕ Чайлдс/внуков проверяются)

Класс Компания:

public class Company 
{ 
    public Company() 
    { 
     this.childs = new List<Company>(); 
    } 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public List<Company> childs { get; set; } 
    public int NrOfChilds { get { return childs.Count; } } 
    public bool Checked { 
     get { ??? } 
     set { this.Checked = value; } 
    } 
+0

Не можете ли вы просто перечислить детей в геттере и проверить их состояние? Но, возможно, я не понимаю, чего вы хотите достичь. –

+0

Да, я могу перечислить всех детей. Нет проблем. Это становится сложно, потому что у каждого ребенка могут быть свои собственные дети. Я думаю, что его tristate-bool сочетается с рекурсивной функцией, которая меня смущает. Я просто не могу понять, как написать рекурсивную функцию, которая возвращает правильное значение! – David

+0

Я думаю, что есть простое кодовое решение, связанное с XOR и некоторыми другими вещами, которые мне еще предстоит освоить. Но сейчас я заканчиваю на 60 строк кода, который дает все другие результаты, которые можно себе представить, кроме правильного :) – David

ответ

1

Ok, поэтому использование nullable bool - это требование OLV?

Но не должно ли это работать для достижения того, чего вы хотите?

class Entity { 
    private bool? _CheckState; 
    public List<Entity> ChildEntities { get; set; } 

    public Entity() { 
     _CheckState = false; 
     ChildEntities = new List<Entity>(); 
    } 

    public bool? CheckState { 
     get { 
      if (_CheckState == true) { 
       return true; 
      } else if (ChildEntities.All(child => child.CheckState == false)) { 
       return false; 
      } else { 
       return null; 
      } 
     } 
     set { _CheckState = value; } 
    } 
} 
+0

haha, получив «StackOverflowException» при реализации этого Getter! Вид удовольствия, когда вы думаете об этом :) – David

+0

@David: Этого не должно быть. Но, глядя на ваш пример исходного кода, вы вызываете «set {this.Checked = value;}», что также вызовет StackOverflow (каламбур не предназначен;)), потому что вы рекурсивно вызываете это свойство. Может быть, вы сделали ту же ошибку в сеттер? –

+0

yep, пропустил это. Я назвал это. Вместо этого. Теперь его работа. Большой thx! – David

Смежные вопросы