2012-09-08 40 views
6

Tengo un problema al actualizar mi cuadrícula de datos al hacer clic en el botón usando NotifyPropertyChanged. Funciona si configuro DataGrid.ItemsSource en el código, pero no si configuro en xaml. aquí hay un código de código detrás & xaml:WPF DataGrid no se actualiza en PropertyChanged

namespace MyWpfDataBindingLab 
{ 
public partial class NpcWindow : Window 
{ 
    DataCollection dc = new DataCollection(); 

    public NpcWindow() 
    { 
     InitializeComponent(); 
     //command binding code 
     //... 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //if i set the ItemsSource here, updating of the UI works 
     //dataGrid1.ItemsSource = dc; 
    } 

    private void CmdCollectionChangedExecute(object sender, ExecutedRoutedEventArgs e) 
    { 
     foreach (SampleClass s in dc) 
     { 
      s.Property1 = "changed"; 
      s.Property3 = "changed"; 
      s.Property3 = "changed"; 
      break; 
     } 

     dc.Add(new SampleClass("new sample 1", "new sample 2", "new sample 3")); 
    } 
} 
} 

<Window x:Class="WPFDataBinding.NpcWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:npc="clr-namespace:WPFDataBinding.NotifyPropChanged" 
    Title="MainWindow" Height="189" Width="459" Loaded="Window_Loaded"> 
<Window.Resources> 
    <npc:DataCollection x:Key="dataCol"/> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
    </Grid.ColumnDefinitions> 
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="349,110,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> 
    <!-- if i set the ItemsSource here, updating of the UI doesn't work --> 
    <DataGrid ItemsSource="{Binding Source={StaticResource dataCol}, Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
       AutoGenerateColumns="True" Height="103" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="331" /> 
</Grid> 

mis datos & NotifyPropertyChanged aplicación:

namespace MyWpfDataBindingLab.NotifyPropChanged 
{  
public class SampleClass : NotifyPropertyChanged 
{ 
    private string _field1; 
    private string _field2; 
    private string _field3; 

    public string Property1 
    { 
     get { return _field1; } 
     set 
     { 
      _field1 = value; 
      OnPropertyChanged("Property1"); 
     } 
    } 

    public string Property2 
    { 
     get { return _field2; } 
     set 
     { 
      _field2 = value; 
      OnPropertyChanged("Property2"); 
     } 
    } 

    public string Property3 
    { 
     get { return _field3; } 
     set 
     { 
      _field3 = value; 
      OnPropertyChanged("Property3"); 
     } 
    } 

    public SampleClass() 
    { 
     _field1 = "value1"; 
     _field2 = "value2"; 
     _field3 = "value3"; 
    } 

    public SampleClass(string p1, string p2, string p3) 
    { 
     _field1 = p1; 
     _field2 = p2; 
     _field3 = p3; 
    } 
} 
} 

namespace MyWpfDataBindingLab.NotifyPropChanged 
{ 
public abstract class NotifyPropertyChanged : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
} 

namespace MyWpfDataBindingLab.NotifyPropChanged 
{ 
public class DataCollection : ObservableCollection<SampleClass> 
{ 
    public DataCollection() 
    { 
     this.Add(new SampleClass()); 
     this.Add(new SampleClass()); 
     this.Add(new SampleClass()); 
    } 
} 
} 

no tengo ni idea de lo que es el problema. Apreciaría si alguien puede ayudar a resolver mi problema.

+0

¿Tiene algún código que realmente agregue elementos a la instancia de 'DataCollection'? Si no agrega nada, el controlador 'CmdCollectionChangedExecute' no se activará. – slugster

+0

la colección se actualiza a través de CmdCollectionChangedExecute al hacer clic en el botón. el nombre del método es un poco confuso. debería ser CmdCollectionChangeExecute. la actualización funciona bien, pero el ui solo se está actualizando si se establece el ItemSource en el código. me gusta hacerlo solo en el archivo xaml. – nllpntr

Respuesta

9

En sus .xaml.cs codebehind Crear propiedad

public ObservableCollection<SampleClass> MyCollection {get; set;} 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
    //if i set the ItemsSource here, updating of the UI works 
     dataGrid1.ItemsSource = MyCollection; 
    } 

En XAML:

<DataGrid ItemsSource="{Binding Path=., Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/> 
+0

gracias por la respuesta rápida. tu código esta funcionando bien es posible deshacerse de dataGrid1.ItemsSource = MyCollection; en el código de atrás, y hacer el enlace completo en xaml? – nllpntr

+0

Puede usar this.DataContext = MyCollection; – syned

+0

¡Gracias! Esto es justo lo que estaba buscando: resolvió mi problema bastante bien. – Fred

7

he seguido en la punta de syned. Para mí que tuve que nosotros el modo como

Mode=TwoWay 

La clave aquí es la propiedad

UpdateSourceTrigger 

.

Muchas gracias ...!