Встановити значення нульового значення в прив'язці WPF


116

будь ласка, подивіться на наступний рядок

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

Ця ціна властивості зверху - це Decimal? (десяткове число).

Я хочу, що якщо користувач видаляє вміст текстового поля (тобто вводить порожню рядок, він повинен автоматично оновлювати джерело з null (Нічого в VB).

Будь-які ідеї, як я можу це зробити "Xamly"?

Відповіді:


226

Я використовую .NET 3.5 SP1, тому це дуже просто:

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

На чому стоїть (дякую Грегору за ваш коментар):

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

sysімпортний XML - простору для Systemв mscorlib:

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

Сподіваюся, що це допомогло.


13
Насправді TargetNullValue працює чудово. Що він робить, це встановити еквівалентність між заданим значенням і нулем. Отже, у цьому випадку, коли прив’язане значення дорівнює нулю, воно відображатиме порожню рядок, а коли цільовим значенням є порожня рядок, воно встановлюватиме прив’язане значення до нуля.
Брайан Андерсон

4
TargetNullValue працює. Я отримав однакові результати при використанні перетворювача значень. Ви також можете спростити вираз: <TextBox Text = "{Прив’язана ціна, TargetNullValue = ''}" />
Грегор Славець

2
Я розгублений - ОП говорить: ".. воно повинно автоматично оновлювати джерело з нулем [коли Target порожня рядок].", Але TargetNullValue оновлює ціль , а не джерело !
markmnl

1
Ти не єдиний збентежений - є й заплутані коментарі щодо другої відповіді. ОП також трохи заплутаний, коли він каже, що оновить джерело, він насправді означає ціль у WPF говорити (джерело - це властивість Text у TextBox). TargetNullValue говорить про те, яке значення встановити Джерело, коли ціль є нульовою. Зворотній бік цього, що ми тут і використовуємо, полягає в тому, що коли джерело буде оновлено до зазначеного значення, то ціль буде встановлена ​​на нуль.
Nathan Phillips

@markmnl Хоча TargetNullValue дійсно призначений для оновлення, Targetа не того Source, це рішення все-таки робить фокус чомусь (я не міг точно зрозуміти, чому).
Тім Польманн

12

Цей перетворювач значень повинен зробити фокус:

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

Заявіть про екземпляр цього перетворювача в ресурсах:

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

І використовуйте це у своїй палітурці:

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

Зверніть увагу, що TargetNullValueтут не доречно: воно використовується для визначення того, яке значення слід використовувати, коли sourceприв'язка є нульовою. Тут Priceне джерело, це властивість джерела ...


2
Конвертер - це правильний спосіб зробити це, і ви не можете визначити ці перетворювачі в XAML. Перетворювачі дозволяють змінити типову поведінку конверсії "об'єкт до об'єкта" за умовчанням, що саме ви хочете зробити.
Уїлл Еддінс

Проблема в моєму випадку полягає в тому, що я вже використовую конвертер, який робить іншу справу. Я опублікував відповідь, будь ласка, подивіться.
Шиммі Вайцхандлер

можливо, ви хочете використовувати IsNullOrWhiteSpace (), щоб дозволити "" зараховуватись до нуля (швидше за все, що ви хочете)
Simon_Weaver

+1 Однак: ціна тут є вашим джерелом, але ви правильні. TargetNullValue тут не підходить - TargetNullValue встановлює ціль, коли джерело є нульовим - тоді як ми хочемо встановити джерело (нульове), коли ціль - це певне значення (порожнє string) - що робить ваш конвертер.
markmnl

5

Ви можете спробувати використовувати ValueConverter (IValueConverter) http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

Ззаду моєї голови тут щось таке:

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

(Можливо, вам потрібне певне налаштування)


Я вважаю за краще спосіб Xamly, але я нічого не можу придумати
Shimmy Weitzhandler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.