繁体   English   中英

Avalonia ReactiveUI RoutedViewHost 未创建嵌入适当的视图

[英]Avalonia ReactiveUI RoutedViewHost not creating embedding appropriate view

我正在关注本教程,我确实看到它基于.net core 2.1 framework ,但适用于.net 5 avalonia.mvvm模板。 考虑到 .net 5 中的 avalonia.mvvm 模板实现了ViewLocator.cs class 所以我不相信我必须使用Locator ,因此我遵循了除Program.cs文件之外的代码行。 然而,当我在Router.NavigationStack.Count递增时运行应用程序时,视图仍保留其默认内容。 这是代码

/// MainWindow.axaml
    <Design.DataContext>
        <vm:MainWindowViewModel/>
    </Design.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <rxui:RoutedViewHost Grid.Row="0" Router="{Binding Router}" PageTransition="{x:Null}">
            <rxui:RoutedViewHost.DefaultContent>
                <TextBlock Text="Main Window"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Center" />
            </rxui:RoutedViewHost.DefaultContent>
        </rxui:RoutedViewHost>
        <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="15">
            <StackPanel.Styles>
                <Style Selector="StackPanel > :is(Control)">
                    <Setter Property="Margin" Value="2"/>
                </Style>
                <Style Selector="StackPanel > TextBlock">
                    <Setter Property="VerticalAlignment" Value="Center"/>
                </Style>
            </StackPanel.Styles>
            <Button Content="Go next" Command="{Binding GoNext}" />
            <Button Content="Go back" Command="{Binding GoBack}" />
            <TextBlock Text="{Binding Router.NavigationStack.Count}" />
        </StackPanel>
    </Grid>

//MainWindowViewModel.cs

    public class MainWindowViewModel : ViewModelBase, IScreen
    {
        public RoutingState Router { get; } = new RoutingState();
        public ReactiveCommand<Unit, IRoutableViewModel> GoNext { get; }
        public ReactiveCommand<Unit, Unit> GoBack => Router.NavigateBack;
        public MainWindowViewModel()
        {
            GoNext = ReactiveCommand.CreateFromObservable(
                () => Router.Navigate.Execute(new CommandCenterViewModel(this))
            );
        }
    }

//CommandCenterView.axaml
<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:vm="using:GuiClient.ViewModels"
             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" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="GuiClient.Views.CommandCenterView">
  <StackPanel HorizontalAlignment="Center"
                VerticalAlignment="Center">
        <TextBlock x:Name="PathTextBlock" Text="Hi, I'm the first view!" />
        <TextBlock Text="{Binding UrlPathSegment}" />
    </StackPanel>
</UserControl>

///CommandCenterViewModel.cs
    public class CommandCenterViewModel : ViewModelBase, IRoutableViewModel
    {
        public string UrlPathSegment { get; } = Guid.NewGuid().ToString().Substring(0, 5);

        public IScreen HostScreen { get; }

        public CommandCenterViewModel(IScreen screen) => HostScreen = screen;
    }

//ViewLocator.cs in case this is relevant 
    public class ViewLocator : IDataTemplate
    {
        public IControl Build(object data)
        {
            var name = data.GetType().FullName!.Replace("ViewModel", "View");
            var type = Type.GetType(name);

            if (type != null)
            {
                return (Control)Activator.CreateInstance(type)!;
            }
            else
            {
                return new TextBlock { Text = "Not Found: " + name };
            }
        }

        public bool Match(object data)
        {
            return data is ViewModelBase;
        }
    }

尝试在网上搜索,找不到遇到同样问题的人。 我很感激帮助/被指出正确的方向。 谢谢!

显然,答案只是当前 avalonia.mvvm 模板的ViewLocator.cs RoutedViewHostReactiveUI中的 RoutedViewHost 工作所需的IViewLocator无关。 只需将此行添加到Program.cs

Locator.CurrentMutable.Register(() => new CommandCenterView(), typeof(IViewFor<CommandCenterViewModel>));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM