【问题标题】:Flyout Textbox TwoWay Binding弹出文本框双向绑定
【发布时间】:2018-06-12 14:02:47
【问题描述】:

我正在尝试在弹出窗口中设置我的文本框文本绑定,但我的视图模型的绑定属性设置器从未被调用。我有这样的视图设置:

<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 与绑定一起使用,然后在按钮的单击事件中,设置代码隐藏以调用

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

在调试过程中,我可以看到 textBox.Text 值已正确更改,但 UpdateSource() 仍未调用 setter。如果这很重要,我正在使用 Windows 10 Build 14393(周年纪念版)。

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

【问题讨论】:

  • 启动时是否调用了getter?
  • 浮出控件打开时调用 getter。

标签: c# mvvm uwp


【解决方案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

【讨论】:

  • 如果要更新可以使用DataContext=null;DataContext=xx
  • 我没有怀疑绑定错误的两个原因:1)EditCommand 很好,2)我可以从 VM 设置 EditQty 并且值显示正确。我已经按照您的建议打印出 Datacontext 进行了测试,它按预期显示了我的虚拟机。
【解决方案2】:

根据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" />

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多