2012-02-10 11 views
11

nasıl şablonun şunun gibi görünür yazabilirsiniz wpf için UpdateSourceTrigger = PropertyChanged uygulansın mı?tüm metin kutularının

<DataTemplate ... TextBlock> 
    UpdateSourceTrigger=PropertyChanged 
    </DataTemplate> 

cevap

10

Bir tarzında UpdateSourceTrigger için varsayılan modunu değiştiremezsiniz. (Bu durumda Text mülkiyet) DependencyProperty kayıtlı olduğunda bu FrameworkPropertyMetadata sınıfın DefaultUpdateSourceTrigger olarak yapılandırılır.

Sen bağımlılık özelliği kaydolurken bu değeri TextBox kaynaklanmaktadır ve değiştiren bir özel metin kutusu türü oluşturabilir ya. Alternatif olarak, otomatik (bağlama dayalı olan kongre kapsamında, kod aracılığıyla) bir uygulamadaki tüm metin kutuları için bu ayarlar Caliburn.Micro MVVM çerçevesi içine bakmak isteyebilirsiniz.

+0

cevabı güncelledik. – devdigital

+0

MVVM çerçevesini kullanarak bir göz attınız mı? Bu size bir sürü iş kazandıracak ve bağlanma Caliburn.Micro ile bir sevinç. Kendi çözümünüzü kullanmak istiyorsanız, kendi TextBox türetilmiş türünüzü oluşturmak yerine özel bir biçimlendirme uzantısı veya özel bir ciltleme yazılabilir. bazı fikirler için http://www.paulstovell.com/wpf-delaybinding veya http://www.hardcodet.net/2008/04/wpf-custom-binding-class göz at. – devdigital

+0

Cevabınız için teşekkür ederiz! – syned

1

Hemen kabul cevabı uzanan (ve evet, ben bu soruyu :) necromancing de farkındayım):

Aslında kendi TextBox oldukça basittir, TextBoxExt (çok uzatılmaması arama sağlar, ama bilirsin ...)

public class TextBoxExt : TextBox 
{ 
    private static readonly MethodInfo onTextPropertyChangedMethod 
     = typeof(TextBox).GetMethod("OnTextPropertyChanged", BindingFlags.Static | BindingFlags.NonPublic); 
    private static readonly MethodInfo coerceTextMethod 
     = typeof(TextBox).GetMethod("CoerceText", BindingFlags.Static | BindingFlags.NonPublic); 
    static TextBoxExt() 
    { 

     TextProperty.OverrideMetadata(
     typeof(TextBoxExt), 

     // found this metadata with reflector: 
     new FrameworkPropertyMetadata(string.Empty, 
             FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, 
             new PropertyChangedCallback(MyOnTextPropertyChanged),callback 
             new CoerceValueCallback(MyCoerceText), 
             true, // IsAnimationProhibited 
             UpdateSourceTrigger.PropertyChanged) 
     ); 
    } 

    private static object MyCoerceText(DependencyObject d, object basevalue) 
    { 
     return coerceTextMethod.Invoke(null, new object[] { d, basevalue }); 
    } 

    private static void MyOnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     onTextPropertyChangedMethod.Invoke(null, new object[] { d, e }); 
    } 

    } 

bir yerlerinde {ResourceDictionary} .xaml veya App.xaml içinde

:

<Style TargetType="{x:Type control:TextBoxExt}" 
     BasedOn="{StaticResource {x:Type TextBox}}" /> 
İlgili konular