如何将XAML contentView绑定到其后台代码

xxls0lw8  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(164)

我有一些UI逻辑,我需要将它们添加到代码隐藏中。为了克服代码重复,我需要使用属性并更改它。正常的MVVM事情。但当我尝试使用代码隐藏来做这件事时。这意味着我将XAML与我的代码隐藏绑定,以便在几个地方访问isvisible函数。问题是它没有绑定,或者任何其他问题在触发操作时可见性没有更改。
我的内容视图XAML

<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:customRenderes="clr-namespace:DipsDemoXaml.CustomRenderes;assembly=DipsDemoXaml"
         x:Class="DipsDemoXaml.Views.Page1"
         x:Name="navi">

<StackLayout   BindingContext="{x:Reference Name=navi}">
        <customRenderes:NavigationImageButton Source="MenuSettings"                                                
                                                      x:Name="Button1"                                                        
                                                    Margin="0"                                                       
                                                    IsVisible="{Binding Visibility}"                                                                                                                                                                                                                                                                                                                             
                />

在程式码后置中

public partial class Page1 : ContentView
{
    private bool _expand;

    private bool _visibility;

    public bool Visibility
    {
        get => _visibility;
        set
        {
            _visibility = value;
            OnPropertyChanged();
        }
    }

    public Page1 ()
    {
        InitializeComponent ();        
    }

    private  void  Button1_OnItemTapped(object sender, EventArgs e)
    {
        if (_expand)
        {
            this.Hide();
        }
        else
        {
            this.Expand();
        }
    }

    private async void Expand()
    {
        _expand = true;
        Button5.Opacity = 1;          
        _visibility = true;
        await Button5.RotateTo(180, 200);
    }

    private async void Hide()
    {
        _expand = false;
        Button5.Opacity = 0.4;
        _visibility = false;
        await Button5.RotateTo(360, 200);
    }
}

如何绑定这个在xamarin形式。是我的绑定是错误的或哪里的问题
我的onpropertychanged方法

public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;

        changed?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
zynd9foi

zynd9foi1#

调用Visibility,而不是_visibility,或者手动触发OnPropertyChanged。但是首选第一个选项。顺便说一句,我不知道你的OnPropertyChanged实现是什么,但是通常用你的属性名调用它,如@Maniax提到的,或者使用nameof操作符,例如OnPropertyChanged(nameof(Visibility))

6ovsh4lw

6ovsh4lw2#

首先,PropetyChanged接受一个参数,

OnPropertyChanged("Visibility");

我想这应该可以工作,但是把你的ViewModel代码放在后面的代码中是很奇怪的。
MVVM的思想是将逻辑从一个页面移动到另一个ViewModel,从而允许您在同一个ViewModel中管理多个页面的状态,而在XAML后面的页面中几乎没有代码。
因此,您可能应该创建另一个名为ViewModel的文件,并将业务逻辑放入其中。

<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
     xmlns:customRenderes="clr- 
     namespace:DipsDemoXaml.CustomRenderes;assembly=DipsDemoXaml"
     x:Class="DipsDemoXaml.Views.Page1"
     xmlns:vm="clr-namespace:DipsDemoXaml.ViewModels;assembly=DipsDemoXaml"
     x:Class="DipsDemoXaml.Views.Page1"
     x:Name="navi">

<ContentView.BindingContext>
  <vm:MyViewModel/>
</ContentView.BindingContext>
<StackLayout>
<customRenderes:NavigationImageButton Source="MenuSettings"                                                
                                      x:Name="Button1"                                                        
                                      Margin="0"                                                       
                                      IsVisible="{Binding Visibility}"/>

在MyViewModel.cs中:

private bool _visibility;

public bool Visibility
{
    get => _visibility;
    set
    {
        _visibility = value;
        OnPropertyChanged("Visibility");
    }
}

因此您可以处理任何您想要的装订,并在不同的页面中轻松使用它们。
我希望这能帮上忙。

相关问题