2017-01-13 20 views
0

は私が3 DataGridTextColumns DataGridの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> 

全3つのDataGridTextColumnsデータ

のObservableCollectionに追加されるとデータグリッドを持っています。 コレクションを繰り返してインスタンスを取得し、次の行の値を設定します。

フィールドのいずれかが更新されると、プログラムはそれに応じて更新する必要があります。

現在、私は開始フィールドのみを操作できますが、長さフィールドは操作できません。

テキストドキュメントの最初のフィールドを1行とし、テキストドキュメントの次の行の長さフィールドを考えると、これらの2つのフィールドは完全に離れている必要があります。私は達成しようとしています。私はかなりプログラミングに新しいですし、アルゴリズムのスキルは強力ではありません。私を助けてください、私が言った何かが意味をなさないならば、私ができる限り最善を尽くすように私に教えてください。 詳細については、コードを参照してください。

ありがとうございました!

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

の後ろにあなたのビューモデルクラスでこのロジックを処理する必要があります。

FieldオブジェクトのPropertyChangedイベントを処理してObservableCollection<Field>に追加し、それに応じて開始フィールドと終了フィールドを再計算することができます。あなたのアイデア与える必要があり、次のサンプルコードを参照してください:

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