Xamarin.Forms MVVM WebView未加载

时间:2018-01-20 12:39:01

标签: xamarin mvvm webview binding

我们使用Xamarin.Forms WebView显示某个对象的内容,但在我们旋转设备两次之前,这些内容不会显示在WebView中。

.xmal - 文件代码:

<WebView x:Name="WebView" HeightRequest="{Binding Height}" WidthRequest="{Binding Width}">
    <WebView.Source>
        <HtmlWebViewSource Html="{Binding Code}"/>
    </WebView.Source>
</WebView>

和ModelView:

    private double _height;
    private double _width;
    public ICommand ItemTappedCommand { get; private set; }
    public string SearchBarLabelText { get; private set; }
    public object LastTappedItem { get; set; }
    public int ColumnCount { get; private set; } = 2;

    public string CodeName { get; private set; }
    public string CodeContent { get; private set; }

    public string Code { get; private set; }

    public double Height
    {
        get => _height;
        private set
        {
            if (_height == value)
                return;
            _height = value;
            OnPropertyChanged(nameof(Height));
        }
    }

    public double Width
    {
        get => _width;
        private set
        {
            if (_width == value)
                return;
            _width = value;
            OnPropertyChanged(nameof(Width));
        }
    }

    public ErrorcodeDetailPageViewModel(Errorcode code)
    {
        Device.Info.PropertyChanged += DevicePropertyChanged;
        DevicePropertyChanged(null, null);

        Code = code.Content;
        CodeName = code.Label;
        CodeContent = code.Content;


    }

    private void DevicePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (Device.Info.CurrentOrientation)
        {
            case DeviceOrientation.Portrait:
                Height = Device.Info.PixelScreenSize.Height - 150; // 120 is the Height of the ControlTemplate used on this Page + the top row on uwp; only required in portrait mode
                Width = Device.Info.PixelScreenSize.Width;
                break;

            case DeviceOrientation.Landscape:
                Height = Device.Info.PixelScreenSize.Height - 50;
                Width = Device.Info.PixelScreenSize.Width;
                break;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

所以,als已经描述过,如果我们旋转设备两次,将显示内容,否则它不会。我认为这个问题与我们的绑定有关......

我应该提一下,我们在WebView上面有一些ob横幅/标题。

1 个答案:

答案 0 :(得分:0)

Code还应该有一个支持通知,以便视图知道其值何时发生变化。

private string code;

public string Code {
    get => code;
    private set {
        if (code == value)
            return;
        code = value;
        OnPropertyChanged(nameof(Code));
    }
}

如果你走过为什么必须转两次的步骤,你会发现这就是你必须这样做的原因。

首次设置该值时,它为空白。

在第一次转弯时,值由事件处理程序设置,因为没有通知发送到视图,它没有明显改变。

在第二个回合中,该值已经设置,当视图重绘时,该值将显示在视图中。