2016-08-16 26 views
6

2 özellikli olan DataTemplate Sütun 2 DatePickers var. Bu kontrolde veriler değiştirildiğinde ben Başlangıç ​​ve Bitiş hem Sadece nedeniyle güncellenir güncellemek durumunda sadece son kontrol Bu durumda Veri Şablonu sütununda yalnızca son kontrol güncelleniyor

 <sdk:DataGridTemplateColumn Width="300" CanUserReorder="False" >    
     <sdk:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
       <Grid MouseRightButtonDown="ActionsGrid_MouseRightButtonDown" Width="300" Height="40" MouseLeftButtonDown="ActionsGrid_MouseLeftButtonDown"> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock VerticalAlignment="Stretch" Width="100" Text="{Binding Start, Converter={StaticResource DateConverter}}" 
             Padding="2" HorizontalAlignment="Center" /> 
          <TextBlock VerticalAlignment="Stretch" Width="100" Text="{Binding Due, Converter={StaticResource DateConverter}}" 
             Padding="2" HorizontalAlignment="Center" /> 
         </StackPanel> 
        </Grid> 
       </DataTemplate>             
      </sdk:DataGridTemplateColumn.CellTemplate> 
    <sdk:DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Start, Mode=TwoWay,}" Padding="2" /> 
         <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Due, Mode=TwoWay, ValidatesOnDataErrors=True}" Padding="2" /> 
        </StackPanel> 
       </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellEditingTemplate> 
    </sdk:DataGridTemplateColumn> 

güncellenir. Ayrıca bağlama çalışmaları ince benim Modeli sınıfında Başlat bir kesme noktası koyarsanız çünkü vurmak ama geçti değerini öğrendim bazı ayıklama sonra Başlat

orijinal değeri

DÜZENLEME 1

olduğunu alırsa o Benim sadece DataTemplate'umda bir kontrolüm var. Ayrıca Tarihi değiştirdiğimde Kırılma noktası çok çarpıyor. Fakat birden fazla kontrolüm varsa, noktalama noktası sütun dışına çıkana kadar vurulmaz ve sonra sadece son ciltleme çalışır.

Ben sadece CellTemplate kullanmak ve hücre atmak eğer iyi çalışır fark bazı mroe ayıklama sonra DÜZENLEME 2

EditTemplate

 <sdk:DataGridTemplateColumn Width="300" CanUserReorder="False" >    
      <sdk:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Start, Mode=TwoWay,}" Padding="2" /> 
         <sdk:DatePicker VerticalAlignment="Top" Width="100" SelectedDate="{Binding Due, Mode=TwoWay, ValidatesOnDataErrors=True}" Padding="2" /> 
        </StackPanel> 
       </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellEditingTemplate> 
    </sdk:DataGridTemplateColumn> 

DÜZENLEME 3

private void DatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
     { 
      (sender as DatePicker).GetBindingExpression(DatePicker.SelectedDateProperty).UpdateSource(); 
     } 

Her iki kontrolde de bağlamayı yenilemeyi başardım. selectedDatechange olayı ve ardından gönderen üzerindeki bağları yenileme.

Hala 2 yollu bağlama çalışmasının neden çalışmadığından emin değilim.

Bunun neden olduğunu açıklayabilir mi?

DÜZENLEME 4

Modeli ve Özellikleri

public DateTime? Start 
     { 
      get { return _Start; } 
      set 
      { 
       _Start = value; Dirty = true; 

       if (_Start.HasValue && _Due.HasValue && _Start.Value > _Due.Value) 
        _dataErrors["Start"] = "Start date cannot be greater than the Due date"; 
       else 
        if (_dataErrors.ContainsKey("Start")) 
         _dataErrors.Remove("Start"); 
       NotifyPropertyChanged(); NotifyPropertyChanged("CalcStatus"); 
      } 
     } 
     public DateTime? Due 
     { 
      get { return _Due; } 
      set 
      { 
       _Due = value; Dirty = true; 
       if (_Start.HasValue && _Due.HasValue && _Start.Value > _Due.Value) 
        _dataErrors["Start"] = "Start date cannot be greater than the Due date"; 
       else 
        if (_dataErrors.ContainsKey("Start")) 
         _dataErrors.Remove("Start"); 
       NotifyPropertyChanged("Due"); NotifyPropertyChanged("CalcStatus"); 
      } 
     } 
+0

İlgili viewmodel özelliklerini gösterir. Mülk değişikliği bildirimini düzgün uyguluyor musunuz? – Nkosi

+0

Evet Ben, görünüm modeli INotifyPropertyChanged Olayı uygular ve şablonda yalnızca bir denetim varsa, ne tür bir özelliği bağlı olduğu önemli değil. Birden fazla kontrol durumunda sadece sonuncusu güncellenir.Garip olan şey, başka bir hücre veya sütun seçtiğimde NotifyPropertyChanged'in çağrılması ve daha sonra yalnızca son denetimi güncelleştirmesidir, diğer özellikler de vurulur, ancak geçen değer varolan değerle aynıdır. –

+0

Neden Silverlight ise bir WPF etiketi var? :) BTW UpdateSourceTrigger PropertyChanged desteklenen (veya kullanışlı) nedir? –

cevap

2

Tamam ben nihayet sabit düşünüyorum. Hala neden% 100 emin değilim, neden çalışmıyordum ama yeni bir küçük proje oluşturacağım ve nedenini bulmaya çalışacağım.

Ne oldu? NoitifyPropertyChangedEvent'u [CallerMemberName]'u ileterek değiştirdiğimi ve bu sayede otomatik olarak iletilen özelliğin adını değiştirdim. Yani, örneğin "Başlat" gibi ad özelliğini değiştirirsem NotifyPropertyChanged("Start")'u güncellemekten endişe etmem gerekmez.

public event PropertyChangedEventHandler PropertyChanged; 

     public void NotifyPropertyChanged([CallerMemberName] string propertyName =null) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

Bu

ben DataTemplateColumn vardı hariç tüm özellikler için iyi çalıştı. Standart koda geri dönüp, propertyName geçirerek sorunumu açıkça düzelttim.

public event PropertyChangedEventHandler PropertyChanged; 

     public void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
İlgili konular