在 WPF 上的 ReactiveUI 6.5.0 版本中,简单反应列表绑定失败

Simple reactive list binding fails in 6.5.0 version of ReactiveUI on WPF

我在尝试使用最新版本的 Reactive 创建简单示例时遇到了一个奇怪的错误 UI。

window 打开后出现系统错误

Couldn't find view for 'Hi Bob!'

注意:'Hi Bob!' 是列表中的第一项。

我在这里错过了什么?

谢谢。

版本 反应UI 6.5.0 啪啪 1.6.2 .net 4.5

示例代码

xaml

<Window x:Class="ListBind.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <StackPanel  Orientation="Horizontal">
        <ListBox Name="ListBox1"></ListBox>
    </StackPanel>
</Grid>

代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ReactiveUI;

namespace ListBind
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, IViewFor<ViewModel>
    {
        public MainWindow()
        {
            ViewModel = new ViewModel();
            DataContext = ViewModel;
            InitializeComponent();
            this.OneWayBind(ViewModel, m => m.Items, v => v.ListBox1.ItemsSource);
        }
        public ViewModel ViewModel
        {
            get { return (ViewModel)GetValue(ViewModelProperty); }
            set { SetValue(ViewModelProperty, value); }
        }

        public static readonly DependencyProperty ViewModelProperty =
            DependencyProperty.Register("ViewModel", typeof(ViewModel), typeof(MainWindow), new PropertyMetadata(null));

        object IViewFor.ViewModel
        {
            get { return ViewModel; }
            set { ViewModel = (ViewModel)value; }
        }
    }
    public class ViewModel : ReactiveObject
    {
        public ReactiveList<string> Items = new ReactiveList<string>(new[] { "Hi Bob!", "Two", "Three" });
    }
}

当您使用 OneWayBind 方法绑定到 ListBox 之类的东西时,ReactiveUI 的问题在于它会尝试自动为数据应用自定义模板它通过 Splat.Locator.Resolve 找到的视图。在你的例子中,它试图找到并构建一个基于 "Hi Bob!" ViewModel 的视图,这显然不存在。

您应该做的是强制它使用自定义数据模板,这样它就不会尝试应用不存在的模板。使用下面的模板,它不应该尝试为您解析视图,而是将 "Hi Bob!" 值粘贴到 TextBlock.

<ListBox x:Name="ListBox1">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

ReactiveUI 仍然会忽略它的可能性很小(我现在无法验证),所以如果是这种情况,请将 OneWayBind 绑定替换为传统的 ItemSource={Binding Data}.