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.
¿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
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