Я пытаюсь установить привязку текста текстового поля внутри всплывающего окна, но мой установщик модели просмотра для связанного свойства никогда не вызывается. У меня такая настройка вида:

<CommandBar>
   <AppBarButton Icon="Edit" AllowFocusOnInteraction="true">
      <Flyout>
         <StackPanel>
            <TextBlock Text="Enter Qty:" />
            <TextBox Text="{Binding EditQty, Mode=TwoWay}" InputScope="Number" />
            <Button Content="Update" Command="{Binding EditCommand}" />
         </StackPanel>
      </Flyout>
<CommandBar>

Мой код модели просмотра также прост:

public decimal _editQty;
public decimal EditQty
{
    get => _editQty;
    set => Set(ref _editQty, value);
}

Я даже пытался использовать UpdateSourceTrigger = Explicit с привязкой, а затем в событии нажатия кнопки настроить выделенный код для вызова

textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();

Во время отладки я вижу, что значение textBox.Text изменилось правильно, но метод установки все еще не вызывается UpdateSource (). Я использую Windows 10 Build 14393 (Anniversary Edition), если это важно.

Есть ли способ сделать это? На этом этапе мне придется отказаться от этой идеи и поместить текстовое поле в диалоговое окно, хотя его наличие во всплывающем меню было бы лучше для пользователя.

4
Rkand 3 Янв 2018 в 00:37

2 ответа

Лучший ответ

Согласно Microsoft, UWP не может выполнять двухстороннюю привязку к десятичной системе счисления со времен WinRT! (Причина: не спрашивайте!) Их решение - использовать float.

Если вам действительно нужно привязать к десятичной системе счисления, кажется, вы можете вручную преобразовать с помощью IValueConverter (спасибо Стивену Олсону, решение которого было связано с ответом):

public class DecimalConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value.ToString();
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return decimal.Parse(value as string);
    }
}

Моя привязка теперь выглядит так:

<TextBox Text="{Binding EditQty, Mode=TwoWay, Converter={StaticResource DecimalConverter}}" InputScope="Number" />
4
Rkand 3 Янв 2018 в 14:16

Иногда это происходит при работе со всплывающими окнами / элементами управления, имеющими альтернативное визуальное дерево. Некоторые свойства не каскадируются. Когда это случается со мной, я использую TextBlock для вывода типа DataContext:

<CommandBar>
   <AppBarButton Icon="Edit" AllowFocusOnInteraction="true">
      <Flyout>
         <StackPanel>
            <TextBlock Text="{Binding}" /> <!-- This will print typeof DataContext -->

            <TextBlock Text="Enter Qty:" />
            <TextBox Text="{Binding EditQty, Mode=TwoWay}" InputScope="Number" />
            <Button Content="Update" Command="{Binding EditCommand}" />
         </StackPanel>
      </Flyout>
<CommandBar>

Если этот TextBlock напечатан пустым, то вы знаете, что DataContext не попадает в ваш Flyout.

1
Laith 2 Янв 2018 в 22:47