【发布时间】:2018-06-10 16:18:28
【问题描述】:
我有一个实现INotifyPropertyChanged 的ContentDialog。我有一个 TextBox,其 Text 属性通过 x:Bind 语法绑定到我的代码隐藏上的字符串属性。
如果我编辑TextBox的内容,然后点击ContentDialog中的另一个控件(失去焦点TextBox),然后点击主按钮,由我到的时候主按钮单击事件处理程序的文本属性已更新为 TextBox 控件 = PERFECT 的内容。
但是,如果我更改了 TextBox 的内容,但将其保持在焦点上,然后单击主按钮,则绑定永远不会更新。
这似乎是因为ContentDialog中的内置按钮在触发点击事件处理程序之前没有获得焦点,并且x:Bind只支持LostFocus绑定,这些绑定永远不会更新.
我很惊讶这个大错误的存在。所以我的两个问题是
1) 是否有解决方法
2) 我是否必须放弃 x:Bind 并使用 WPF 样式的 Binding 语法,我可以在绑定本身中更改 UpdateSourceTrigger。
我希望另一位 UWP 开发人员遇到过这个问题并知道解决方法
编辑
我创建了一些示例代码来演示这个问题。
页面:
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Button Content="Open" Click="OpenClick" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Page>
后面的代码:
public sealed partial class MainPage : Page
{
public MainPage()
{
InitializeComponent();
}
private async void OpenClick(object sender, RoutedEventArgs e)
{
var dialog = new ContentDialog1();
await dialog.ShowAsync();
}
}
内容对话框:
<ContentDialog
x:Class="App1.ContentDialog1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="TITLE"
PrimaryButtonText="Button1"
PrimaryButtonClick="ContentDialog_PrimaryButtonClick">
<Grid>
<TextBox Text="{x:Bind Path=TestText, Mode=TwoWay}" HorizontalAlignment="Center" VerticalAlignment="Center" MinWidth="100"/>
</Grid>
</ContentDialog>
后面的内容对话框代码:
public sealed partial class ContentDialog1 : ContentDialog, INotifyPropertyChanged
{
public ContentDialog1()
{
InitializeComponent();
}
private string _testText;
public string TestText
{
get => _testText;
set
{
_testText = value;
OnPropertyChanged(nameof(TestText));
}
}
private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我的目标 sdk 版本是:
如果您单击打开内容对话框,输入一些文本,然后单击主按钮 - 如果您在单击处理程序中有断点,您会看到绑定没有更新为您输入的文本
【问题讨论】: