2015-06-10 40 views
2

我有一個DataGrid和一個對象之間的雙向綁定。我只想在用戶單擊保存按鈕時將DataGrid中所做的更改保存到對象中。作爲第一步,我設置UpdateSourceTrigger = Explicit。當我將該屬性設置爲explicit(因爲我還沒有調用UpdateSource())時,我會期望不會發生綁定,但是與我的預期相反,當關閉並重​​新啓動程序時,這些更改將綁定到對象。爲什麼wpf UpdateSourceTrigger沒有明確綁定?

爲什麼我的更改仍然綁定到我的對象的設置?

這裏是我的XAML文件中我的相關的DataGrid代碼:

<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> 
+0

你能發佈最低(非)工作示例嗎?什麼是數據對象?你使用依賴屬性?你在使用視圖模型嗎? – Ruskin

回答

1

與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 class Data : INotifyPropertyChanged 
{ 
    private string _Name; 

    public string Name 
    { 
     get { return _Name; } 
     set 
     { 
      _Name = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    private int _Length; 

    public int Length 
    { 
     get { return _Length; } 
     set 
     { 
      _Length = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Length")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

我的測試代碼:

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; 
    } 
} 

它會得到纔剛剛開始,之後的事件的PropertyChanged從GUI修改值時,它不會觸發。所以最後,您將能夠保存來自代碼後面的修改。

+0

現在將DataGridTextColumn的格式更改爲DataGridTemplateColumn現在明確地進行了該綁定(:任何想法爲什麼DataGridTextColumn不起作用? – reubonwry

相關問題