ReactiveUI: представление не содержит определения для «когда активировано» - PullRequest
0 голосов
/ 31 марта 2019

Я получаю следующую ошибку 'MachineLayoutView' does not contain a definition for 'WhenActivated' and the best extension method overload 'ViewForMixins.WhenActivated(ISupportsActivation, Func<IEnumerable<IDisposable>>)' requires a receiver of type 'ISupportsActivation' В строке this.WhenActivated конструктора View

Насколько я могу судить, я правильно следую Getting Started .

Примечание. Я использую WPF, и мои ViewModels находятся в отдельной сборке / проекте, на который ссылается проект Views. (Не уверен, имеет ли это значение или нет)

View

using RAL.RealTime.ViewModel;
using ReactiveUI;
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;

namespace RAL.RealTime
{
    /// <summary>
    /// Interaction logic for MachineLayoutView.xaml
    /// </summary>
    public partial class MachineLayoutView : ReactiveUserControl<MachineLayoutViewModel>
    {
        public MachineLayoutView()
        {
            InitializeComponent();

            this.WhenActivated(disposableRegistration =>
            {
                this.OneWayBind(this.ViewModel,
                                    viewModel => viewModel.MachineStatuses,
                                    view => view.MachineStatuses)
                                    .DisposeWith(disposableRegistration);
            });
        }
    }
}

ViewModel

using RAL.Repository;
using ReactiveUI;
using System;
using System.Collections.Generic;
using System.Text;

namespace RAL.RealTime.ViewModel
{
    public class MachineLayoutViewModel : ReactiveObject
    {
        private ObservableAsPropertyHelper<IEnumerable<MachineStatusViewModel>> _machineStatuses { get; set; }
        public IEnumerable<MachineStatusViewModel> MachineStatuses => _machineStatuses.Value;

    }
}

EDIT:

Согласно предложению Гленна Уотсона, я попробовал следующее без изменений.

public MachineLayoutView()
{
    InitializeComponent();

    this.WhenActivated(disposableRegistration =>
    {
        disposable(this.OneWayBind(ViewModel,
                            viewModel => viewModel.MachineStatuses,
                            view => view.MachineStatuses));

    });

}

1 Ответ

0 голосов
/ 03 апреля 2019

Это ошибка компиляции или времени выполнения?Если это время компиляции.Убедитесь, что XAML (при условии, что есть XAML) имеет правильное пространство имен и что элемент управления представлением того же типа, что и унаследованный тип в.т. е. UserControl должно читаться ReactiveUserControl в сценарии XAML.

зацепка с самого начала:

<reactiveui:ReactiveUserControl
  x:Class="ReactiveDemo.NugetDetailsView"
  xmlns:reactiveDemo="clr-namespace:ReactiveDemo"
  x:TypeArguments="reactiveDemo:NugetDetailsViewModel"
  xmlns:reactiveui="http://reactiveui.net"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>
      <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>
      <Image x:Name="iconImage" Margin="6" Width="64" Height="64"
             HorizontalAlignment="Center" VerticalAlignment="Center"/>
      <TextBlock Grid.Column="1" TextWrapping="WrapWithOverflow" 
                 Margin="6" VerticalAlignment="Center">
          <Run FontSize="14" FontWeight="SemiBold" x:Name="titleRun"/>
          <LineBreak />
          <Run FontSize="12" x:Name="descriptionRun"/>
          <LineBreak />
          <Hyperlink x:Name="openButton">Open</Hyperlink>
      </TextBlock>
  </Grid>
</reactiveui:ReactiveUserControl>
...