ReactiveUI 绑定在 UWP 应用程序的发布版本中不起作用
ReactiveUI Binding does not work in Release build in a UWP app
我在 ReactiveUI 和绑定中遇到了一个奇怪的问题,绑定在调试版本中工作正常,但在发布版本中却不行。
我这里有一个示例应用程序的代码,它显示了这个问题。在调试版本中,当我在文本框中键入内容时,视图模型中的 InputText 属性 会相应更新,当我点击按钮时,它会在消息对话框中向我显示更新的输入文本。但是 Release build 中的相同代码不起作用,因为 InputText 始终为空。
有人知道这里发生了什么吗?
<Page x:Class="RxBind.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<TextBox x:Name="MyTextBox" Margin="10"/>
<Button x:Name="MyButton" Content="Show Dialog" Margin="10"/>
</StackPanel>
</Page>
public sealed partial class MainPage : IViewFor<MainPageViewModel>
{
public MainPage()
{
InitializeComponent();
ViewModel = new MainPageViewModel();
this.WhenActivated(d =>
{
d(this.BindCommand(ViewModel, vm => vm.MyButtonCommand, v => v.MyButton));
d(this.Bind(ViewModel, vm => vm.InputText, x => x.MyTextBox.Text));
});
}
#region IViewFor impl
object IViewFor.ViewModel
{
get { return ViewModel; }
set { ViewModel = (MainPageViewModel)value; }
}
public MainPageViewModel ViewModel { get; set; }
#endregion //IViewFor impl
}
public class MainPageViewModel : ReactiveObject
{
private string _inputText = string.Empty;
public string InputText
{
get { return _inputText; }
set { this.RaiseAndSetIfChanged(ref _inputText, value); }
}
public ReactiveCommand<Unit, Unit> MyButtonCommand { get; }
public MainPageViewModel()
{
MyButtonCommand = ReactiveCommand.CreateFromTask(async () =>
{
await new MessageDialog($"InputText={InputText}").ShowAsync();
});
}
}
这并不是您 "what's going on here," 问题的真正答案,但我是提交 Matt Whilden 链接到的另一个错误的人,我暂时通过参考文本解决了这个问题按钮事件并从那里调用命令,而不是将命令直接绑定到按钮,有点像这样:
d(Observable.FromEventPattern<RoutedEventHandler, object, RoutedEventArgs>(h => MyButton.Click += h, h => MyButton.Click -= h).Subscribe(x=>
{
ViewModel.InputText = MyTextBox.Text;
ViewModel.MyButtonCommand.Execute(null);
}));
不优雅,但对我有用,因为我真的不需要更新 属性 更改 - 只需单击按钮即可。在问题解决之前,也许这对您也有用。
正如 Matt Whilden 在 this thread 中提到的那样,使用运行时指令方法可以解决问题,因此我将其标记为正确答案。非常感谢 Matt Whilden。
我在 ReactiveUI 和绑定中遇到了一个奇怪的问题,绑定在调试版本中工作正常,但在发布版本中却不行。
我这里有一个示例应用程序的代码,它显示了这个问题。在调试版本中,当我在文本框中键入内容时,视图模型中的 InputText 属性 会相应更新,当我点击按钮时,它会在消息对话框中向我显示更新的输入文本。但是 Release build 中的相同代码不起作用,因为 InputText 始终为空。
有人知道这里发生了什么吗?
<Page x:Class="RxBind.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<TextBox x:Name="MyTextBox" Margin="10"/>
<Button x:Name="MyButton" Content="Show Dialog" Margin="10"/>
</StackPanel>
</Page>
public sealed partial class MainPage : IViewFor<MainPageViewModel>
{
public MainPage()
{
InitializeComponent();
ViewModel = new MainPageViewModel();
this.WhenActivated(d =>
{
d(this.BindCommand(ViewModel, vm => vm.MyButtonCommand, v => v.MyButton));
d(this.Bind(ViewModel, vm => vm.InputText, x => x.MyTextBox.Text));
});
}
#region IViewFor impl
object IViewFor.ViewModel
{
get { return ViewModel; }
set { ViewModel = (MainPageViewModel)value; }
}
public MainPageViewModel ViewModel { get; set; }
#endregion //IViewFor impl
}
public class MainPageViewModel : ReactiveObject
{
private string _inputText = string.Empty;
public string InputText
{
get { return _inputText; }
set { this.RaiseAndSetIfChanged(ref _inputText, value); }
}
public ReactiveCommand<Unit, Unit> MyButtonCommand { get; }
public MainPageViewModel()
{
MyButtonCommand = ReactiveCommand.CreateFromTask(async () =>
{
await new MessageDialog($"InputText={InputText}").ShowAsync();
});
}
}
这并不是您 "what's going on here," 问题的真正答案,但我是提交 Matt Whilden 链接到的另一个错误的人,我暂时通过参考文本解决了这个问题按钮事件并从那里调用命令,而不是将命令直接绑定到按钮,有点像这样:
d(Observable.FromEventPattern<RoutedEventHandler, object, RoutedEventArgs>(h => MyButton.Click += h, h => MyButton.Click -= h).Subscribe(x=>
{
ViewModel.InputText = MyTextBox.Text;
ViewModel.MyButtonCommand.Execute(null);
}));
不优雅,但对我有用,因为我真的不需要更新 属性 更改 - 只需单击按钮即可。在问题解决之前,也许这对您也有用。
正如 Matt Whilden 在 this thread 中提到的那样,使用运行时指令方法可以解决问题,因此我将其标记为正确答案。非常感谢 Matt Whilden。