我有绑定ObservableCollection - DataGrid(模式 - TwoWay),但我希望自己使用UpdateSource()调用更新集合并禁用自动源更新。我设置绑定像
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; }
编辑:我将ObservableCollection更改为DataTable以实现预期的行为。但我仍然有兴趣解决这个问题,因为我想了解为什么在编辑表之后对可观察集合更新源的任何绑定(阅读我对安德鲁的帖子的评论)。
答案 0 :(得分:0)
在这里,您已设置视图以显式更新BezierPoints属性,因为这是您绑定ItemsSource的内容。
我将假设你真正想要的是对各个点的属性使用显式更新触发器。为此,您需要将DataGridTextColum绑定更改为UpdateSourceTrigger = Explicit。
作为旁注,您可能无法从View更新BezierPoints集合,因为该属性具有私有设置器。