2014-12-07 2 views
0

У меня есть привязка ObservableCollection - DataGrid (режим - TwoWay), но я хочу, чтобы сбор обновлений сам с помощью UpdateSource() вызывал и отключал автоматическое обновление исходного кода. Я установил привязку, какWPF двусторонняя привязка с явным обновлением исходного кода не работает

ItemsSource="{Binding Path=Bezier.BezierPoints, Mode=TwoWay, UpdateSourceTrigger=Explicit}" 

но моя коллекция все еще обновляется автоматически. Ниже приведены образцы кода. Что я делаю не так? Мой XAML:

<DataGrid Name="BezierPointsDataGrid" Margin="5" AutoGenerateColumns="False" 
        Grid.Column="0" Grid.Row="0" Background="White" 
        ItemsSource="{Binding Path=Bezier.BezierPoints, Mode=TwoWay, UpdateSourceTrigger=Explicit}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="X" Binding="{Binding Path=X}" Width="1*"/> 
       <DataGridTextColumn Header="Y" Binding="{Binding Path=Y}" Width="1*"/> 
      </DataGrid.Columns> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="SelectionChanged"> 
        <i:InvokeCommandAction Command="{Binding Path=UpdateBezierPointsCommand}" CommandParameter="{Binding ElementName=BezierPointsDataGrid}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </DataGrid> 

Мой ViewModel:

class BezierCurveViewModel : INotifyPropertyChanged 
{ 
    #region Bezier curve model 

    private BezierCurveModel _bezier; 

    public BezierCurveModel Bezier 
    { 
     get { return _bezier; } 
     set 
     { 
      if (_bezier == value) 
       return; 
      _bezier = value; 
      OnPropertyChanged("Bezier"); 
     } 
    } 

    #endregion 

    #region Commands 

    public ICommand UpdateBezierPointsCommand { set; get; } 

    #endregion 

    #region Constructor 

    public BezierCurveViewModel() 
    { 
     UpdateBezierPointsCommand = new Command(a => ((DataGrid)a).GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateSource()); 
     Bezier = new BezierCurveModel(); 
    } 

    #endregion 

    #region INotifyPropertyChanged implementation 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 
} 

Моя модель:

public ObservableCollection<DPoint> BezierPoints { private set; get; } 

EDIT: Я изменил ObservableCollection Для DataTable, чтобы достичь ожидаемого поведения. Но я все еще заинтересован в решении этой проблемы, потому что хочу понять, почему привязка к наблюдаемому источнику обновлений коллекции после редактирования таблицы (прочитайте мой комментарий к сообщению Эндрю).

ответ

0

Здесь вы настроили представление, чтобы обновить свойство BezierPoints явно, поскольку именно это вы связываете с ItemsSource.

Я предполагаю, что вы действительно хотите использовать триггер Явного обновления для свойств отдельных точек. Для этого вам необходимо изменить привязку DataGridTextColum к UpdateSourceTrigger = Explicit.

В качестве побочного примечания, казалось бы, невозможно было бы вообще обновить коллекцию BezierPoints из View, потому что свойство имеет частный сеттер.

+0

Самое странное в том, что когда я изменяю привязку datagrid на '{Binding Path = Bezier.BezierPoints, Mode = OneTime}' и разрешает автоколонны, которые моя коллекция все еще обновляет при обновлении таблицы (я полагаю, что это не правильное поведение привязки по времени) , И о приватном сеттере - я сделал его приватным, потому что я не хочу, чтобы моя коллекция была назначена как «BezierPoints = new ....» в коде viewmodel, мне просто нужно добавлять, удалять, обновлять операции. –

+0

Что вы подразумеваете под обновлением? какой конкретный объект обновляется? – Andrew

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