WPF bağlamada değeri null olarak ayarla


116

lütfen aşağıdaki satıra bir göz atın

<TextBox Text="{Binding Price}"/>

Yukarıdaki bu Price özelliği bir Decimal?(Null yapılabilir ondalık).

Kullanıcı metin kutusunun içeriğini silerse (yani boş dizge girerse, kaynağı otomatik olarak null (VB'de Hiçbir Şey) ile güncellemesini istiyorum.

Bunu 'Xamly'yi nasıl yapabileceğime dair bir fikriniz var mı?

Yanıtlar:


226

.NET 3.5 SP1 kullanıyorum, bu yüzden çok basit:

<TextBox Text="{Binding Price, TargetNullValue=''}"/>

(Yorumunuz için teşekkürler Gregor):

<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>

sysiçin ithal xml ad alanıdır Systemiçinde mscorlib:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

Umarım yardımcı olmuştur.


13
Aslında TargetNullValue gayet iyi çalışıyor. Yaptığı şey, verilen değer ile boş arasında bir eşdeğerlik ayarlamaktır. Dolayısıyla bu durumda, bağlı değer null olduğunda boş bir dize görüntüler ve hedefin değeri boş dize olduğunda, bağlı değeri null olarak ayarlar.
Bryan Anderson

4
TargetNullValue çalışır. Değer dönüştürücüyü kullanırken aynı sonuçları aldım. İfadeyi de basitleştirebilirsiniz: <TextBox Text = "{Binding Price, TargetNullValue = ''}" />
Gregor Slavec

2
Kafam karıştı - OP diyor ki: ".. kaynağı otomatik olarak null ile güncellemeli [Hedef boş bir dize olduğunda].", Ancak TargetNullValue , Kaynağı değil Hedefi güncelliyor !
markmnl

1
Kafası karışan tek kişi sen değilsin - diğer cevapta da kafa karıştırıcı yorumlar var. OP de biraz kafa karıştırıyor, kaynağı güncelle derken, aslında WPF'deki Hedef konuşmayı kastediyor (kaynak, TextBox'taki Text özelliğidir). TargetNullValue, Hedef null olduğunda Kaynağın hangi değere ayarlanacağını söyler. Bunun tersi, burada faydalandığımız şey, kaynak belirtilen bu değere güncellendiğinde, hedefin null olarak ayarlanacağıdır.
Nathan Phillips

@markmnl TargetNullValue gerçekten de güncellemeyi amaçlasa Targetda Source, bu çözüm hala bir nedenden dolayı hile yapıyor (nedenini tam olarak anlayamadım).
Tim Pohlmann

12

Bu değer dönüştürücü hile yapmalı:

public class StringToNullableDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture)
    {
        decimal? d = (decimal?)value;
        if (d.HasValue)
            return d.Value.ToString(culture);
        else
            return String.Empty;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        string s = (string)value;
        if (String.IsNullOrEmpty(s))
            return null;
        else
            return (decimal?)decimal.Parse(s, culture);
    }
}

Kaynaklarda bu dönüştürücünün bir örneğini bildirin:

<Window.Resources>
    <local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>

Ve bunu cildinizde kullanın:

<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>

Not TargetNullValueburada uygun değildir: zaman hangi değer tanımlamak için kullanılır kullanılmalıdır sourcebağlanmasının boş. İşte Pricekaynak değil, kaynağın bir mülkü ...


2
Bir dönüştürücü, bunu yapmanın doğru yoludur ve bu dönüştürücüleri XAML'de tanımlayamazsınız. Dönüştürücüler, veri bağlamada varsayılan "nesneden nesneye" dönüştürme davranışını değiştirmenize izin verir, bu da yapmak istediğiniz şeydir.
Will Eddins

Benim durumumdaki sorun, burada zaten başka bir şey yapan bir dönüştürücü kullanmam. Bir cevap gönderdim, lütfen bir göz atın.
Shimmy Weitzhandler

"" null olarak sayılmasına izin vermek için IsNullOrWhiteSpace () kullanmak isteyebilir (büyük olasılıkla istediğinizi)
Simon_Weaver

+1 Ancak: Buradaki kaynağınız fiyattır ancak haklısınız TargetNullValue burada uygun değildir - TargetNullValue , kaynak null olduğunda hedefi belirler - oysa biz , hedef belirli bir değer olduğunda (boş) kaynağı (null) ayarlamak istiyoruz string) - dönüştürücünüzün yaptığı.
markmnl

5

Bir ValueConverter (IValueConverter) http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx kullanmayı deneyebilirsiniz

Kafamın arkasına şöyle bir şey:

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        return (double)value;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
    var doubleValue = Convert.ToDouble(value);

    return (doubleValue == 0 ? null : doubleValue);
    }
}

(Yine de biraz ince ayar gerekebilir)


Xamly yolunu tercih ederdim ama hiçbir şey düşünemiyorum
Shimmy Weitzhandler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.