2017-01-13 17 views
0

У меня есть DataGrid с 3 DataGridTextColumnsDataGrid WPF Поля

<DataGrid.Columns> 
    <DataGridTextColumn Header="Field Name" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <DataGridTextColumn x:Name="BeginFields" Header="Begin" Binding="{Binding Begin, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
    <DataGridTextColumn x:Name="LengthFields" Header="Length" Binding="{Binding Length, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
</DataGrid.Columns> 

Все три DataGridTextColumns данных добавляется в ObservableCollection. Я перебираю коллекцию для получения экземпляра и устанавливаю значения для следующей строки.

Программа должна обновиться соответственно, если какое-либо из полей будет обновлено.

Прямо сейчас я могу манипулировать только начальным полем, но не полем длины.

Подумайте о начальном поле как строке текстового документа и поле длины в качестве следующей строки в текстовом документе, эти два поля должны быть идеально отделены друг от друга и никогда не пересекаться друг с другом, я надеюсь, что имел смысл в том, что Я пытаюсь выполнить, я довольно новичок в программировании, и мои алгоритмические навыки не являются мощными. Пожалуйста, помогите мне, если что-то, что я сказал, не имеет смысла, пожалуйста, дайте мне знать, я буду изо всех сил стараться. См. Код для более подробной информации.

спасибо !!

The DataGrid View

Я теперь мимо Кодекса за

public MainWindow() 
{ 

    InitializeComponent(); 
    dataGrid.ItemsSource = MWVM.FieldsCollection; 

    fileButton.Click += FileButton_Click; 
    loadPresetButton.Click += LoadPresetButton_Click; 
    savePresetButton.Click += SavePresetButton_Click; 
    clipboardButton.Click += ClipboardButton_Click; 
    saveButton.Click += SaveButton_Click; 

    ****dataGrid.SelectedCellsChanged += ((o, e) => 
    { 
     int track = 0; 

     foreach (Field f in MWVM.FieldsCollection) 
     { 
      track += f.Length; 


      f.Begin = track - f.Length; 
     } 
    }); **** 
} 

public class Field : ViewModelsBase 
{ 

    private string _name; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged("Name"); 

     } 

    } 
    private int _begin; 

    public int Begin 
    { 
     get 
     { 
      return _begin; 
     } 
     set 
     { 
      if (value != _begin) 
      { 
       _begin = value; 
       RaisePropertyChanged("Begin"); 
      } 

     } 
    } 


    private int _length; 
    public int Length 
    { 
     get { return _length; } 

     set 
     { 
      if (value != _length) 
      { 
       _length = value; 
       RaisePropertyChanged("Length"); 
      } 
     } 
    } 

    [JsonIgnore] 
    public string Blank { get; set; } = ""; 
} 

public class MainWindowViewModel : ViewModelsBase 
{ 
    public ObservableCollection<Field> fieldsCollection; 

    public MainWindowViewModel() 
    { 
     _fields = CreateFieldsCollection(); 
    } 



    private ObservableCollection<Field> CreateFieldsCollection() 
    { 
     fieldsCollection = new ObservableCollection<Field>(); 
     return fieldsCollection; 
    } 

    ObservableCollection<Field> _fields; 

    public ObservableCollection<Field> FieldsCollection 
    { 
     get 

     { 
      return _fields; 
     } 
     set 
     { 
      if (_fields != value) 
      { 
       _fields = value; 
       RaisePropertyChanged("FieldsCollection"); 
      } 

     } 
    } 
} 

ответ

1

Вы должны справиться с этой логики в вашей точки зрения модели класса.

Вы можете обработать событие PropertyChanged каждого объекта Field, который добавляется к ObservableCollection<Field> и соответствующим образом пересчитывает поля Begin and Length. Пожалуйста, обратитесь к следующему коду образца, который должен дать вам идею:

public class MainWindowViewModel : ViewModelsBase 
{ 
    public MainWindowViewModel() 
    { 
     _fields = CreateFieldsCollection(); 
     _fields.CollectionChanged += _fields_CollectionChanged; 
    } 

    private ObservableCollection<Field> CreateFieldsCollection() 
    { 
     ObservableCollection<Field> fieldsCollection = new ObservableCollection<Field>(); 
     fieldsCollection.Add(new Field() { Begin = 0, Length = 5 }); 
     fieldsCollection.Add(new Field() { Begin = 5, Length = 5 }); 
     fieldsCollection.Add(new Field() { Begin = 10, Length = 5 }); 
     fieldsCollection.Add(new Field() { Begin = 15, Length = 5 }); 
     fieldsCollection.Add(new Field() { Begin = 20, Length = 5 }); 
     foreach (Field field in fieldsCollection) 
      field.PropertyChanged += item_PropertyChanged; 
     return fieldsCollection; 
    } 

    private void _fields_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (object field in e.NewItems) 
      { 
       (field as INotifyPropertyChanged).PropertyChanged 
        += new PropertyChangedEventHandler(item_PropertyChanged); 
      } 
     } 

     if (e.OldItems != null) 
     { 
      foreach (object country in e.OldItems) 
      { 
       (country as INotifyPropertyChanged).PropertyChanged 
        -= new PropertyChangedEventHandler(item_PropertyChanged); 
      } 
     } 

    } 

    private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (_fields.Count < 2) 
      return; 

     switch(e.PropertyName) 
     { 
      case "Length": 
       //recalculate the begin of each field 
       RecalculateBegin(); 
       break; 
      case "Begin": 
       Field modifiedField = sender as Field; 
       int indexOfModifiedField = FieldsCollection.IndexOf(modifiedField); 
       if(indexOfModifiedField > 0) 
       { 
        //recalculate the length of the previous field: 
        Field previousField = FieldsCollection[indexOfModifiedField - 1]; 
        previousField.Length = modifiedField.Begin - previousField.Begin; 
       } 
       //...and the recalculate the begin of the rest of the fields: 
       RecalculateBegin(); 
       break; 
     } 
    } 

    private void RecalculateBegin() 
    { 
     int length = _fields[0].Begin + _fields[0].Length; 
     for (int i = 1; i < FieldsCollection.Count; ++i) 
     { 
      FieldsCollection[i].Begin = length; 
      length += FieldsCollection[i].Length; 
     } 
    } 

    private ObservableCollection<Field> _fields; 
    public ObservableCollection<Field> FieldsCollection 
    { 
     get { return _fields; } 
     set 
     { 
      if (_fields != value) 
      { 
       _fields = value; 
       RaisePropertyChanged("FieldsCollection"); 
      } 
     } 
    } 
} 

enter image description here

+0

Дорогой друг, удивительно вы выяснили, что Ive пытался добиться того, что чувствует, как эр ... алгоритм, безусловно, это, но, пожалуйста, простите меня, снимок экрана, который я загрузил, ввел вас в заблуждение. DataGrid всегда будет начинаться с 1 строки и пустых полей, пользователь будет заполнять ячейки/поля по мере их прохождения, в ячейках нет предустановленных значений изображение Ive загружено ... приложение запускается, будет только 1 строка, и DataGrid будет генерировать дополнительные строки на основе потребностей пользователей. Еще раз спасибо! и извините за ужасное объяснение. – Ahhzeee

+0

Как я могу отметить это, как вам ответил? Спасибо!!! – Ahhzeee

+1

Вы должны увидеть контур галочки в левой части ответа. Нажмите на нее, чтобы принять ответ: http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – mm8