У меня есть привязка 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, чтобы достичь ожидаемого поведения. Но я все еще заинтересован в решении этой проблемы, потому что хочу понять, почему привязка к наблюдаемому источнику обновлений коллекции после редактирования таблицы (прочитайте мой комментарий к сообщению Эндрю).
Самое странное в том, что когда я изменяю привязку datagrid на '{Binding Path = Bezier.BezierPoints, Mode = OneTime}' и разрешает автоколонны, которые моя коллекция все еще обновляет при обновлении таблицы (я полагаю, что это не правильное поведение привязки по времени) , И о приватном сеттере - я сделал его приватным, потому что я не хочу, чтобы моя коллекция была назначена как «BezierPoints = new ....» в коде viewmodel, мне просто нужно добавлять, удалять, обновлять операции. –
Что вы подразумеваете под обновлением? какой конкретный объект обновляется? – Andrew