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

时间:2015-05-22 19:07:12

标签: c# wpf reactiveui

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

窗口打开,我收到系统错误

  

无法找到嗨Bob的视图!'

注意:'嗨鲍勃!'是列表中的第一项。

我在这里缺少什么?

感谢。

版本 ReactiveUI 6.5.0 Splat 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" });
    }
}

1 个答案:

答案 0 :(得分:2)

使用ReactiveUI方法绑定ListBox之类的内容时,OneWayBind的内容是,它会尝试根据视图自动为数据应用自定义模板它找到了Splat.Locator.Resolve。在你的情况下,它试图找到并建立一个基于&#34; Hi Bob!&#34; ViewModel,显然不存在。

您应该做的是强制它使用自定义数据模板,以便它不会尝试应用不存在的模板。使用下面的模板,它不应该尝试为您解决视图,而是坚持使用&#34; Hi Bob!&#34;价值进入TextBlock

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

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