我正在尝试在弹出窗口中设置文本框文本绑定,但我的viewmodel的绑定属性的setter永远不会被调用。我有这样的视图设置:
<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>
我的viewmodel代码也很简单:
public decimal _editQty;
public decimal EditQty
{
get => _editQty;
set => Set(ref _editQty, value);
}
我甚至尝试使用UpdateSourceTrigger = Explicit和绑定,然后在按钮的click事件中,设置codebehind来调用
textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
在调试期间,我可以看到textBox.Text值已正确更改,但UpdateSource()仍未调用setter。如果重要的话,我正在使用Windows 10 Build 14393(周年纪念版)。
有办法做到这一点吗?在这一点上,我将不得不废弃这个想法并将文本框放在一个对话框中,即使它在弹出窗口中有更好的用户体验。
答案 0 :(得分:4)
根据Microsoft,自WinRT天以来,UWP无法对小数进行TwoWay绑定! (原因是:不要问!)他们的解决方案是使用浮动。
如果你真的需要绑定到十进制,似乎你可以使用IValueConveter手动转换(感谢Stephan Olson的解决方案与答案相关联):
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" />
答案 1 :(得分:1)
有时在处理具有备用可视树的弹出窗口/控件时会发生这种情况。有些房产没有级联。每当发生这种情况时,我会使用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
。