C# 为什么wpf UpdateSourceTrigger没有显式绑定?
我在DataGrid和对象之间有双向绑定。我只想在用户单击保存按钮时将DataGrid中所做的更改保存到对象。作为第一步,我设置UpdateSourceTrigger=Explicit。当我将该属性设置为explicit(因为我还没有调用UpdateSource())时,我本以为不会发生绑定,但与我的预期相反,当我关闭并重新启动程序时,更改会绑定到该对象 为什么我的更改仍然绑定到对象的设置 以下是我的xaml文件中的相关DataGrid代码:C# 为什么wpf UpdateSourceTrigger没有显式绑定?,c#,wpf,xaml,datagrid,updatesourcetrigger,C#,Wpf,Xaml,Datagrid,Updatesourcetrigger,我在DataGrid和对象之间有双向绑定。我只想在用户单击保存按钮时将DataGrid中所做的更改保存到对象。作为第一步,我设置UpdateSourceTrigger=Explicit。当我将该属性设置为explicit(因为我还没有调用UpdateSource())时,我本以为不会发生绑定,但与我的预期相反,当我关闭并重新启动程序时,更改会绑定到该对象 为什么我的更改仍然绑定到对象的设置 以下是我的xaml文件中的相关DataGrid代码: <DataGrid x:Name="DataG
<DataGrid x:Name="DataGrid1" IsReadOnly="False"
AutoGenerateColumns="False" CanUserAddRows="False" SelectionUnit="Cell"
ItemsSource="{Binding data}">
<DataGrid.DataContext>
<Binding Source="{StaticResource myData}" UpdateSourceTrigger="Explicit"/>
</DataGrid.DataContext>
<DataGrid.Columns>
<DataGridTextColumn Header="Field" Binding="{Binding Path=name, Mode=TwoWay,
UpdateSourceTrigger=Explicit}" Width="Auto"/>
<DataGridTextColumn Header="Length of Field" Binding="{Binding Path=length, Mode=TwoWay,
UpdateSourceTrigger=Explicit}" Width="Auto"/>
</DataGrid.Columns>
</DataGrid>
尝试使用DataGridTemplateColumn而不是TextColumn:
<Window x:Class="DataGridUpdateSourceTriggerOneWay.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataGridUpdateSourceTriggerOneWay"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid x:Name="DataGrid1"
IsReadOnly="False"
AutoGenerateColumns="False"
CanUserAddRows="False"
SelectionUnit="Cell"
ItemsSource="{Binding data}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Field">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Name, Mode=TwoWay,
UpdateSourceTrigger=Explicit}" Width="Auto"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Length of Field">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Length, Mode=TwoWay,
UpdateSourceTrigger=Explicit}" Width="Auto"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
和我的测试代码:
public partial class MainWindow : Window
{
public ObservableCollection<Data> data { get; set; }
public MainWindow()
{
InitializeComponent();
data = new ObservableCollection<Data>();
data.Add(new Data() { Name = "Data1", Length = 1 });
data.Add(new Data() { Name = "Data2", Length = 2 });
this.DataContext = this;
}
}
公共部分类主窗口:窗口
{
公共可观测收集数据{get;set;}
公共主窗口()
{
初始化组件();
数据=新的ObservableCollection();
Add(newdata(){Name=“Data1”,Length=1});
Add(newdata(){Name=“Data2”,Length=2});
this.DataContext=this;
}
}
它将仅在开始时访问PropertyChanged事件,之后,当从GUI修改值时,它将不会触发。因此,最后,您将能够从代码隐藏中保存您的修改 你能给出一个最低限度的(非)工作示例吗?什么是数据对象?您正在使用依赖项属性吗?您正在使用视图模型吗?将格式从DataGridTextColumn更改为DataGridTemplateColumn现在可以显式绑定(:知道DataGridTextColumn不工作的原因吗?
public partial class MainWindow : Window
{
public ObservableCollection<Data> data { get; set; }
public MainWindow()
{
InitializeComponent();
data = new ObservableCollection<Data>();
data.Add(new Data() { Name = "Data1", Length = 1 });
data.Add(new Data() { Name = "Data2", Length = 2 });
this.DataContext = this;
}
}