2012-09-08 18 views
6

Düğme tıklatıldığında NotifyPropertyChanged kullanarak bir güncelleştirme sorunum var. DataGrid.ItemsSource'ı arkada kodda ayarlıyorum, ancak xaml olarak ayarlamazsam işe yaramaz. burada & xaml arkasında kod bazı kod: i sorunun ne hiçbir fikrim yokWPF DataGrid, PropertyChanged üzerinde güncelleştirilmiyor

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

:

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> 

verilerim & uygulanmasını NotifyPropertyChanged. Birisi benim problemimi çözmede yardımcı olabilirse memnun olurum. senin codebehind .xaml.cs ise

+0

Gerçekten "DataCollection" örneğine öğeler ekleyen herhangi bir kodunuz var mı? Hiçbir şey eklemezseniz, 'CmdCollectionChangedExecute' işleyicisi çalışmaz. – slugster

+0

koleksiyonu, düğmeyi tıklatırken CmdCollectionChangedExecute aracılığıyla güncelleştirilir. yöntem adı biraz kafa karıştırıcı. CmdCollectionChangeExecute olabilir. güncelleştirme iyi çalışıyor, ancak UI yalnızca ItemsSource'ı arka planda kod olarak ayarladıysa güncelleniyor. Bunu sadece xaml dosyasında yapmayı seviyorum. Hızlı yanıt için – nllpntr

cevap

9

XAML olarak mülk

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

oluşturun:

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

teşekkürler. kodunuz iyi çalışıyor. dataGrid1.ItemsSource = MyCollection'dan kurtulmak mümkün mü? arkasında kod ve xaml içinde tam bağlayıcı mı? – nllpntr

+0

Bunu kullanabilirsiniz.DataContext = MyCollection; – syned

+0

Teşekkürler! Bu sadece aradığım şey - problemimi oldukça güzel çözdüm. – Fred

7

Ben en SYNED ucunda takip etti. Benim için burada anahtar

UpdateSourceTrigger 

özellik oldu

Mode=TwoWay 

olarak bize Modu açıktı.

Çok teşekkürler ...!