弹出文本框TwoWay绑定

时间:2018-01-02 21:37:25

标签: c# mvvm uwp

我正在尝试在弹出窗口中设置文本框文本绑定,但我的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(周年纪念版)。

有办法做到这一点吗?在这一点上,我将不得不废弃这个想法并将文本框放在一个对话框中,即使它在弹出窗口中有更好的用户体验。

2 个答案:

答案 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