2014-01-20 3 views
0

Я создаю форму, которая позволит пользователю добавлять фильтры к данным для обработки.WPF привязка GridView к элементу в коллекции

Я установка:

public Class RuleGroup 
{ 
    public ObservableCollection<Rule> Rules {get; set;} 
    ... 
} 

public Class Rule 
{ 
    public ObservableCollection<String> Fields {get; set;} 
    public ObservableCollection<Rule> Rules {get; set;} 
    ... 
} 

public class Criteria 
{ 
    public int ItemId{ get; set;} 
    public string Field{ get; set;} 
    public OperationType Operation{ get; set;} 
    public string Value {get; set;} 
    public string Value2 {get; set;} 
} 

Так Правило содержит список критериев, которые должны быть согласованы, если правило будет применяться. Каждый критерий в правиле должен указывать значение для каждого выбранного поля. Количество полей может варьироваться от одной RuleGroup к следующей.

Я пытаюсь создать форму, удобную при создании нескольких правил. Я думал о наличии GridView в форме, связанной с этим классом.

Правило = Строка Критерии = Column

В настоящее время у меня есть функция, которая генерирует DataTable на основе правил/критериях в качестве пользовательского перехода от одного RuleGroup к другому, но я думаю, что мое быть лучше подходит это

Любые идеи или помощь была бы оценена

Благодаря

ответ

0

Right Подумай я получил его.

Нужно изменить мои классы немного, чтобы получить правильные группы/иерархию. Затем я смог связать столбец, используя индекс элементов в коллекции.

Это дало мне результат, который я хотел. Хотя есть небольшая проблема, когда я хотел бы иметь доступ к индексу, используя строку Name, а не позицию. В настоящее время я должен убедиться, что «Критерий» находится в правильном порядке при доступе к значениям.

Вот ссылка на Source code

Rule Group

public class RuleGroup 
{ 
    public String Description { get; set; } 
    public ObservableCollection<Rule> Rules { get; set; } 

    public RuleGroup() 
    { 
     Rules = new ObservableCollection<Rule>(); 
    } 
} 

Правило

public class Rule 
{ 
    public Rule() 
    { 
     Criteria = new ObservableCollection<Criteria>(); 
    } 

    public String Description { get; set; } 
    public ObservableCollection<Criteria> Criteria { get; set; } 

    readonly ObservableCollection<RuleField> _Fields = new ObservableCollection<RuleField>(); 
    public IEnumerable<RuleField> Fields 
    { 
     get 
     { 
      return _Fields; 
     } 

    } 

    public void AddField(string name, string header) 
    { 
     if (_Fields.FirstOrDefault(i => i.Name == name) == null) 
     { 
      RuleField field = new RuleField(_Fields.Count) 
      { 
       Name = name, 
       Header = header 
      }; 

      _Fields.Add(field); 

      AddFieldToCriteria(field); 

     } 

    } 

    void AddFieldToCriteria(RuleField field) 
    { 
     foreach (Criteria c in Criteria) 
     { 
      if (c.Values.FirstOrDefault(i => i.Field == field) == null) 
       c.Values.Add(new Criterion() { Field = field, Operation = 1 }); 
     } 
    } 
} 

Критерии

public class Criteria 
{ 
    public Criteria() 
    { 
     Values = new ObservableCollection<Criterion>(); 
    } 

    public ObservableCollection<Criterion> Values { get; set; } 

    public Criterion this[int index] 
    { 
     get 
     { 
      return Values.OrderBy(i=>i.Field.Position).ElementAt(index); 
     } 
     set 
     { 
      Criterion c = Values.OrderBy(i => i.Field.Position).ElementAt(index); 
      c= value; 
     } 
    } 

} 

Критерий

public class Criterion 
{ 
    public RuleField Field { get; set; } 
    public int Operation { get; set; } 
    public object Value { get; set; } 
    public object Value2 { get; set; } 
} 

RuleField

public class RuleField 
{ 
    public string Name { get; set; } 
    public string Header { get; set; } 

    int _Position = 0; 

    public int Position 
    { 
     get 
     { 
      return _Position; 
     } 
    } 

    public RuleField(int position) 
    { 
     _Position = position; 
    } 
} 

вид Модель

public delegate void UpdateColumnsEventHandler(object sender, UpdateColumnsEventArgs e); 

public class UpdateColumnsEventArgs 
{ 
    public IEnumerable<RuleField> Columns { get; set; } 

    public UpdateColumnsEventArgs() 
    { 
     Columns = new List<RuleField>(); 
    } 

    public UpdateColumnsEventArgs(IEnumerable<RuleField> columns) 
    { 
     Columns = columns; 
    } 
} 

public class MainWindowViewModel 
{ 
    public event UpdateColumnsEventHandler UpdateColumns; 

    public ObservableCollection<RuleGroup> RuleGroups { get; set; } 

    RuleGroup _SelectedRuleGroup = null; 
    public RuleGroup SelectedRuleGroup 
    { 
     get 
     { 
      return _SelectedRuleGroup; 
     } 
     set 
     { 
      if (_SelectedRuleGroup == value) 
       return; 

      _SelectedRuleGroup = value; 

     } 
    } 

    public Rule _SelectedRule = null; 
    public Rule SelectedRule 
    { 
     get 
     { 
      return _SelectedRule; 
     } 
     set 
     { 
      if (_SelectedRule == value) 
       return; 

      _SelectedRule = value; 

      if (UpdateColumns != null) 
       UpdateColumns(this, new UpdateColumnsEventArgs(_SelectedRule.Fields)); 
     } 
    } 

    public MainWindowViewModel() 
    { 
     RuleGroups = new ObservableCollection<RuleGroup>(); 

     RuleGroup rg = new RuleGroup(); 
     rg.Description = "Rule Group A"; 

     Rule r = new Rule(); 
     r.Description = "Rule 1"; 

     Random random = new Random(); 
     int range = 10000; 

     for (int x = 0; x < 2000; x++) 
     { 
      Criteria c = new Criteria(); 
      c.Values.Add(new Criterion() 
      { 
       Field = new RuleField(0) 
       { 
        Name = "A", 
        Header = "A Column" 
       }, 
       Operation = 1, 
       Value = "X" 
      }); 

      c.Values.Add(new Criterion() 
      { 
       Field = new RuleField(0) 
       { 
        Name = "B", 
        Header = "B Column" 
       }, 
       Operation = 1, 
       Value = x % 10 
      }); 

      r.Criteria.Add(c); 
     } 

     #region Fields 

     r.AddField("A", "A Column"); 
     r.AddField("B", "B Column"); 
     r.AddField("C", "C Column"); 

     #endregion 

     rg.Rules.Add(r); 

     r = new Rule(); 
     r.Description = "Rule 2"; 

     for (int x = 0; x < 1750; x++) 
     { 
      r.Criteria.Add(new Criteria()); 
     } 

     #region Fields 

     r.AddField("A", "A Column"); 
     r.AddField("B", "B Column"); 

     #endregion 

     rg.Rules.Add(r); 

     RuleGroups.Add(rg); 
    } 
} 

WPF Window

<Window x:Class="RuleMappingTest.MainWindow" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:RuleMappingTest" 
       Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <vm:MainWindowViewModel UpdateColumns="UpdateGridColumns"/> 
    </Window.DataContext> 
    <Grid Name="LayoutRoot"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <ListBox Grid.Row="0" ItemsSource="{Binding RuleGroups}" SelectedItem="{Binding SelectedRuleGroup}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Description}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <ListBox Grid.Row="1" ItemsSource="{Binding SelectedRuleGroup.Rules}" SelectedItem="{Binding SelectedRule}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Description}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

     <DataGrid x:Name="CriteriaGrid" Grid.Row="2" ItemsSource="{Binding SelectedRule.Criteria}" AutoGenerateColumns="False" > 
     </DataGrid> 
    </Grid> 
</Window> 

WPF код позади

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

    } 
    public void UpdateGridColumns(object sender, UpdateColumnsEventArgs e) 
    { 
     CriteriaGrid.Columns.Clear(); 
     foreach (RuleField rf in e.Columns) 
     { 
      DataGridTextColumn c = new DataGridTextColumn(); 
      c.Header = rf.Header; 
      Binding b = new Binding(String.Format("[{0}].Value", rf.Position)); 
      CriteriaGrid.Columns.Add(c); 
      c.Binding = b; 
     } 
    } 
} 
Смежные вопросы