2015-06-10 4 views
2

У меня есть двусторонняя привязка между DataGrid и объектом. Я хочу сохранить изменения, внесенные в DataGrid, в объект, когда пользователь нажимает кнопку сохранения. В качестве первого шага я устанавливаю UpdateSourceTrigger = Explicit. Я бы не ожидал, что привязка не произойдет, когда я установил это свойство в явное (поскольку я еще не назвал UpdateSource()), но, вопреки моему ожиданию, изменения привязаны к объекту, когда я закрываю и перезапускаю программу.Почему wpf UpdateSourceTrigger явно не привязывается?

Почему мои изменения все еще привязаны к настройкам моего объекта?

Вот мое отношение DataGrid коды из моего файла XAML:

<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 только в начале и после этого, при изменении значения из графического интерфейса она не сработает. Поэтому в конце вы сможете сохранить свои модификации от кода позади.

+0

Изменение формата из DataGridTextColumn в DataGridTemplateColumn теперь делает это связывание явно (: Любая идея, почему DataGridTextColumn не работает? – reubonwry