Я пытаюсь установить привязку текста текстового поля внутри всплывающего окна, но мой установщик модели просмотра для связанного свойства никогда не вызывается. У меня такая настройка вида:
<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), если это важно.
Есть ли способ сделать это? На этом этапе мне придется отказаться от этой идеи и поместить текстовое поле в диалоговое окно, хотя его наличие во всплывающем меню было бы лучше для пользователя.
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" />
Иногда это происходит при работе со всплывающими окнами / элементами управления, имеющими альтернативное визуальное дерево. Некоторые свойства не каскадируются. Когда это случается со мной, я использую 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
.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.