2009-08-06 6 views
0

Ich habe ein Listview Item mit einem Gridview Child, gebunden an eine Liste von Objekten. Unterhalb der Gridview habe ich Texboxen um den Inhalt der Gridview (gebunden an die Gridview) zu bearbeiten. Ich kann neuen Inhalt hinzufügen (der in der GridView angezeigt wird). Wenn i Inhalt bearbeiten, ist es in der Tat (in der Objektliste) bearbeitet, aber nicht in der Gridview angezeigt (das Gridview zu aktualisieren scheint nicht)WPF Listview + GridView - Ansicht nicht aktualisieren

XAML-Code:

<!-- ========= --> 
<!-- root Grid --> 
<!-- ========= --> 
<Grid x:Name="root" Margin="10,10,10,10"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="25" /> 
     <RowDefinition Height="25" /> 
     <RowDefinition Height="40" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="40" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <!-- ========= --> 
    <!-- Data Grid --> 
    <!-- ========= --> 
    <ListView x:Name="dataGrid" Grid.Row="0" Grid.ColumnSpan="2" ItemsSource="{Binding}"> 
     <ListView.View> 
      <GridView> 
       <!-- first solution --> 
       <GridViewColumn x:Name="gridColumnName" Header="Name" Width="160"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <ContentControl Content="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <!-- second solution --> 
       <GridViewColumn x:Name="gridColumnPath" Header="Path" DisplayMemberBinding="{Binding Path=Path}" Width="490" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

    <!-- ========= --> 
    <!-- Edit Menu --> 
    <!-- ========= --> 
    <Label Content="Name:" Grid.Row="1" Grid.Column="0" VerticalAlignment="Bottom" HorizontalAlignment="Left"/> 
    <TextBox x:Name="txtBoxName" Grid.Row="1" Grid.Column="1" Width="250" VerticalAlignment="Bottom" HorizontalAlignment="Left" 
      DataContext="{Binding ElementName=dataGrid, Path=SelectedItem}" 
      Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

    <Label Content="Path:" Grid.Row="2" Grid.Column="0" VerticalAlignment="Bottom" HorizontalAlignment="Left" /> 
    <TextBox x:Name="txtBoxPath" Grid.Row="2" Grid.Column="1" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" 
      DataContext="{Binding ElementName=dataGrid, Path=SelectedItem}" 
      Text="{Binding Path=Path, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

Objektliste Klasse:

class ItemList : ObservableCollection<LdapItem> 
{ 
    public ItemList() 
     : base() 
    { 
    } 
} 

Objektklasse:

class LdapItem : INotifyPropertyChanged 
{ 
    #region constructor 

    public LdapItem(String name, String path) 
    { 
     this.iD = Guid.NewGuid().ToString(); 
     this.name = name; 
     this.path = path; 
    } 

    #endregion 

    #region public proterties 

    public String ID 
    { 
     get { return iD; } 
    } 

    public String Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    public String Path 
    { 
     get { return path; } 
     set { path = value; } 
    } 

    #endregion 

    #region public methods 

    public void OnPropertyChanged(string prop) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
    } 

    #endregion 

    #region private variables 

    private String name = String.Empty; 
    private String path = String.Empty; 
    private String iD = String.Empty; 

    #endregion 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

irgendwelche Ideen, warum updati ng GridView funktioniert nicht?

Antwort

3

es scheint, wie Sie die OnPropertyChangedEvent, wenn Ihre Eigenschaftsänderung Feuer vergessen:

public String Name 
{ 
    get { return name; } 
    set { 
      name = value; 
      OnPropertyChanged("Name"); 
     } 
} 

Wenn Sie das Property Ereignis nicht ausgelöst wird WPF können sehen, nicht, wenn das Objekt geändert hat.

4

Wenn Sie mehrere Modelle verwenden, verwenden Sie eine Basisklasse, die INPC implementiert. Ändern Sie dann den Ereignishandler für geänderte Eigenschaften in:

public event PropertyChangedEventHandler PropertyChanged; 

public void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

Dadurch entfällt die Notwendigkeit, die zu ändernde Modelleigenschaft anzugeben. Reduziert die Anzahl der Rechtschreibfehler oder vergessen Sie, den Namen einzugeben. Sie müssen dies weiterhin aufrufen.OnPropertyChanged() obwohl Sie in mehreren Setter fehlen.

Die ItemList-Klasse ist nicht sinnvoll. Es könnte ersetzt werden mit:

public ObservableCollection<LdapItem> LdapItems