2010-12-10 25 views
6

Bir dize ile timeformat arasında dönüştürmek için kullanıyorum bir dönüştürücü ile sorunları yaşıyorum. dönüştürücü kendisi gayet iyi çalışıyor ve bunun gibi implemeneted edilir:Geçerli DataContext ile IValueConverter kullanarak iki yönlü bağlama

[ValueConversion(typeof(string), typeof(SimpleTime))] 
    public class StringToSimpleTimeConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      // convert from string to SimpleTime and return it 
     } 
     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      // convert value from SimpleTime to string and return it 
     } 
    } 

dönüştürücü kullanan XAML böyle usercontrol.resources içinde dönüştürücü kendisi içerir: özellik karşılaşılırsa

<converter:StringToSimpleTimeConverter x:Key="stringToSimpleTimeConverter"/> 

(I 'kullanılan simpletime düzenleme için), arka planda DataTemplate wpf araç ile ilgili veri kılavuzunu kullanıyorum:

<DataTemplate x:Key="SimpleTimeEditingTemplate"> 
     <TextBox Text="{Binding, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/> 
</DataTemplate> 

i karşılaşmak ediyorum sorun con olmasıdır Eğer bir twoway çevirici (ve her iki yönde de ihtiyacım var) ise, bağlayıcıda belirtilen bir yolun olması gerekir, fakat ayarlamak istediğim özellik halihazırda mevcut olan DataContext'tir - O zaman bunun için hangi yolu belirleyebilirim?

Düşünebildiğim tek geçici çözüm, SimpleTime'da yalnızca geçerli SimpleTime'ı alan veya ayarlayan bir kukla özelliktir. herhangi bir yardım olduğunu ...

düzgün çalıştığı ama daha fazla kez için dönüştürücüler ihtiyaç, özellikle gerçekten uygun bir çözüm değildir
<TextBox Text="{Binding Clone, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/> 

aracılığıyla o birine

public class SimpleTime 
{ 
    ... 
    public SimpleTime Clone 
    { 
     get { return new SimpleTime(_amount, _format); } 
     set { this._amount = value._amount; this._format = value._format; } 
    } 
} 

ve bağlama takdir alkış, manni

cevap

5

Bunu

<TextBox Text="{Binding Path=DataContext, 
         RelativeSource={RelativeSource Self}, 
         Converter={StaticResource stringToSimpleTimeConverter}, 
         Mode=TwoWay}"/> 
+0

Ben metin kutusu için bir ana usercontrol kullanarak ve onun datacontext için bağlayıcı kullanarak benzer bir yaklaşım denedim. IValueConverter, dizgeyi simpletime çevirmek için doğru çağrılır ve dizgeyi kontrolde görüntülemek için geri döner, ancak veri yapımdaki simpletime özelliği için hiçbir zaman aranmaz - herkes bunun nasıl olabileceğini biliyor mu? – manni

+0

@manni: Bu konuda bir test uygulaması yaptım ve benim için gayet iyi çalışıyor gibi görünüyor. Kendi DataContext'ine bağlanıyor, bu yüzden işe yaramamak için bir neden göremiyorum. ConvertBack yönteminizin hiçbir zaman çağrılmadığından emin misiniz? –

+1

çaba için teşekkürler. Söylemek istediğim şeyin yeterince açık olmadığını düşünüyorum: GUI'deki değeri değiştirirsem, dönüştürme ve dönüştürme yöntemlerim deniyor. ama ben (simpletime özelliği) ayarlama özelliği özellik setter çağrılmaz (breakpoint tetiklenmedi). Ben şimdi bir göz var, yardımlarınız için çok teşekkürler, ben gerçekten başka bir örnek inşa ettim – manni

0

Sınıfınıza bir sahte özellik tanıtmak yerine, neden aşağıdaki gibi bir kapsayıcı sınıf oluşturmayın:

public class Container 
{ 
    public Object DataItem { get; set; } 

    //... 
} 

ve gibi kullanın:

<TextBox Text="{Binding DataItem, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/> 

Bu işlem bozuk değil/mevcut sınıf mutasyon geçirip hala yapmanız istediğine yapmanıza olanak sağlar.

+0

iyi bir fikir gibi buna bir çözüm bulmak düşünüyorum, ama benim veriyapılarıdır için gerçekten mümkün değildir. her özelliği bir kapsayıcıya koymak istemiyorum ve ana Liste nesnesi doğrudan sınıfın içerdiği özelliklerin her birini, görüntülenen ve düzenlenecek bir sütun için seçtiği datagrid'e doğrudan bağlıdır. . – manni

+1

Yaptığınız şey, her özelliği bir "Denetim" in "DataContext" öğesi olarak ayarlayarak bir yolu belirtmeden "{Binding}" kullanarak bağlamanızdır. Yaptığın şey bu ise, yanlış. Bir ana denetimin 'DataContext '' i ve tüm çocuk denetimlerini türetmelisiniz. Ve yalnızca çocuk denetimlerinde farklı yollar kullanarak bağlamalar kullanın. – decyclone

+0

Datagridcolumns'un bu şekilde çalıştığını düşündüm. Veri ızgarası içinde göstermek veya düzenlemek için data gridde bir gridcell için kullandığım veri formu, tam yapıya ayarlanmış veri standardına sahip olamaz, bu da artık başvurması gereken öznitelik adına sahip olması anlamına gelir. İstediğim şey, veritabanını ismini bilmeden belirli bir türe uygulamaktır, bu yüzden benim codebehind datagridcolumn için bağlamayı ayarlar ve gösterme ve düzenleme için veri sayfalarını ayarlar. Datatemplate, bir çok denemeden daha fazla propertyname için uygulanmıştır, – manni