2016-12-07 4 views
0

제 문제를 올바르게 설명 할 수 있기를 바랍니다. ObservableCollection 객체에 바인딩 된 DataGrid와 DataGrid의 선택된 항목에 바인딩 된 TextBox가 있습니다. 프로그래밍 방식으로 SelectedItem 속성 값 (Name)을 수정할 때 TextBox 텍스트 값이 업데이트되지 않습니다! 여기DataBox에 연결된 TextBox 업데이트

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