Đặt giá trị thành null trong liên kết WPF


116

làm ơn hãy xem dòng sau

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

Thuộc tính Giá này từ phía trên là một Decimal?(Số thập phân có thể rỗng).

Tôi muốn rằng nếu người dùng xóa nội dung của hộp văn bản (tức là nhập chuỗi trống, nó sẽ tự động cập nhật nguồn bằng null (Không có gì trong VB).

Bất kỳ ý tưởng về cách tôi có thể làm điều đó 'Xamly'?

Câu trả lời:


226

Tôi đang sử dụng .NET 3.5 SP1 nên rất đơn giản:

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

Viết tắt của (cảm ơn Gregor vì nhận xét của bạn):

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

syslà không gian tên xml được nhập cho Systemtrong mscorlib:

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

Hy vọng rằng đã giúp.


13
Trên thực tế TargetNullValue hoạt động tốt. Những gì nó làm là đặt giá trị tương đương giữa giá trị đã cho và giá trị null. Vì vậy, trong trường hợp này khi giá trị ràng buộc là null, nó sẽ hiển thị một chuỗi trống và khi giá trị của mục tiêu là chuỗi rỗng, nó sẽ đặt giá trị ràng buộc là null.
Bryan Anderson

4
TargetNullValue hoạt động. Tôi nhận được kết quả tương tự khi sử dụng công cụ chuyển đổi giá trị. Bạn cũng có thể đơn giản hóa biểu thức: <TextBox Text = "{Binding Price, TargetNullValue = ''}" />
Gregor Slavec

2
Tôi bối rối - OP nói: ".. nó nên tự động cập nhật nguồn bằng null [khi Target là một chuỗi rỗng].", Nhưng TargetNullValue cập nhật Target chứ không phải Source !
markmnl

1
Bạn không phải là người duy nhất bối rối - cũng có những bình luận nhầm lẫn về câu trả lời khác. OP cũng hơi bối rối, khi anh ấy nói cập nhật nguồn, anh ấy thực sự có nghĩa là Target trong WPF nói (nguồn là thuộc tính Text trên TextBox). TargetNullValue cho biết giá trị nào cần đặt Nguồn khi Mục tiêu là rỗng. Mặt trái của điều này, đó là những gì chúng tôi đang tận dụng ở đây, là khi nguồn được cập nhật thành giá trị được chỉ định này, thì mục tiêu sẽ được đặt thành null.
Nathan Phillips

@markmnl Trong khi TargetNullValue thực sự được thiết kế để cập nhật Targetchứ không phải Source, giải pháp này vẫn thực hiện thủ thuật vì một số lý do (tôi không thể hiểu rõ tại sao).
Tim Pohlmann

12

Bộ chuyển đổi giá trị này sẽ thực hiện thủ thuật:

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

Khai báo một phiên bản của bộ chuyển đổi này trong ressources:

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

Và sử dụng nó trong ràng buộc của bạn:

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

Lưu ý rằng điều đó TargetNullValuekhông phù hợp ở đây: nó được sử dụng để xác định giá trị nào sẽ được sử dụng khi giá trị sourcecủa ràng buộc là null. Đây Pricekhông phải là nguồn, đó là thuộc tính của nguồn ...


2
Bộ chuyển đổi là cách thích hợp để thực hiện việc này và bạn không thể xác định các bộ chuyển đổi này trong XAML. Trình chuyển đổi cho phép bạn thay đổi hành vi chuyển đổi "đối tượng thành đối tượng" mặc định trong liên kết dữ liệu, đó là những gì bạn muốn làm.
Will Eddins

Vấn đề trong trường hợp của tôi là tôi đã sử dụng một convereter ở đây để làm một việc khác. Tôi đã đăng một câu trả lời, xin vui lòng xem.
Shimmy Weitzhandler

thể muốn sử dụng IsNullOrWhiteSpace () để cho phép "" để được tính là null (nhất có lẽ là những gì bạn muốn)
Simon_Weaver

+1 Tuy nhiên: Giá là nguồn của bạn ở đây nhưng bạn nói đúng TargetNullValue không thích hợp ở đây - TargetNullValue đặt mục tiêu khi nguồn rỗng - trong khi chúng tôi muốn đặt nguồn (thành null) khi mục tiêu là một giá trị nhất định (rỗng string) - công cụ chuyển đổi của bạn.
markmnl

5

Bạn có thể thử sử dụng ValueConverter (IValueConverter) http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

Trong đầu tôi ở đây, một cái gì đó như:

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

(Có thể cần một số điều chỉnh mặc dù)


Tôi muốn một cách Xamly, nhưng tôi không thể nghĩ ra bất cứ điều gì
Shimmy Weitzhandler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.