2012-03-31 16 views
2

Ich habe ein WPF-Textfeld mit einer Bindung an den Datenkontext.Die Abhängigkeitseigenschaft wird nach dem Ändern des Datenkontexts nicht aktualisiert.

<TextBox Grid.Column="1" Grid.Row="4" Text="{Binding Path=Density,UpdateSourceTrigger=PropertyChanged}"/> 

stelle ich die Datacontext in den Code einer der Behälter Steuerung der Textbox (TabItem in diesem Fall)

tiMaterial.DataContext = _materials[0]; 

I mit anderen Materialien auch eine List-Box haben. Ich möchte das Textfeld aktualisieren, wenn ein anderes Material ausgewählt wird, damit ich Code:

private void lbMaterials_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
    _material = (Material) lbMaterials.SelectedValue; 
    tiMaterial.DataContext = _material;    
} 

Die Material Klasse implementiert die INotifyPropertyChanged Schnittstelle. Ich habe das Zwei-Wege-Update funktioniert, nur wenn ich den DataContext ändere, scheinen die Bindungen verloren zu sein.

Was fehlt mir?

Antwort

1

Ich habe versucht, zu tun, was Sie in Ihrem Beitrag beschreiben, aber ehrlich gesagt habe ich das Problem nicht gefunden. In all den Fällen, in denen ich getestet habe, funktioniert mein Projekt perfekt. Ich mag deine Lösung nicht, weil ich denke, dass MVVM klarer ist, aber dein Weg funktioniert auch.

Ich hoffe, das hilft Ihnen.

public class Material 
{ 
    public string Name { get; set; }  
} 

public class ViewModel : INotifyPropertyChanged 
{ 
    public ViewModel() 
    { 
     Materials = new Material[] { new Material { Name = "M1" }, new Material { Name = "M2" }, new Material { Name = "M3" } }; 
    } 

    private Material[] _materials; 
    public Material[] Materials 
    { 
     get { return _materials; } 
     set { _materials = value; 
      NotifyPropertyChanged("Materials"); 
     } 
    } 

    #region INotifyPropertyChanged Members 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = new ViewModel(); 
    } 

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     gridtext.DataContext = (lbox.SelectedItem); 
    } 
} 

.

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <Grid x:Name="gridtext"> 
     <TextBlock Text="{Binding Name}" /> 
    </Grid> 

    <ListBox x:Name="lbox" 
      Grid.Row="1" 
      ItemsSource="{Binding Materials}" 
      SelectionChanged="ListBox_SelectionChanged"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 
Verwandte Themen