2016-12-07 5 views
0

Надеюсь, я смогу правильно объяснить свою проблему. У меня есть datagrid, связанный с объектом ObservableCollection, и TextBox привязан к выбранному элементу моего datagrid. Когда я программно изменяю значение свойства SelectedItem (Name), текстовое значение TextBox не обновляется! вот мой дизайн код:Обновление TextBox, связанного с DataGrid

<DataGrid Name="grid" HorizontalAlignment="Left" Margin="119,28,0,0" VerticalAlignment="Top" Height="237" Width="200" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="nom" Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

    <TextBox Name="textbox" Text="{Binding ElementName=grid, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="18" Margin="119,276,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="392,54,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 

и вот мой код За:

ObservableCollection<Element> obs; 

    class Element 
    { 
     public string Name { get; set; } 
     public Element(string name) { Name = name; } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     obs = new ObservableCollection<Element>() { new Element("element2"), new Element("element2"), new Element("element3")}; 
     grid.ItemsSource = obs; 

    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var sel = grid.SelectedItem as Element; 
     sel.Name = "something"; 
     grid.Items.Refresh(); //this updates the selected element to "something" but does nothing to the textbox 
    } 

ответ

0

Проблема решена.

Мне пришлось запускать событие PropertyChanged всякий раз, когда в модель вносятся изменения. здесь мой новый код:

class Element : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     string name; 

     public string Name 
     { 
      get 
      { 
       return name; 
      } 
      set 
      { 
       name = value; 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); 
      } 
     } 
     public Element(string name) { Name = name; } 
    } 
Смежные вопросы