簡體   English   中英

將自定義視圖綁定到xamarin形式的頁面模型

[英]Bind a custom view to page model in xamarin forms

我正在嘗試創建一個自定義視圖,該視圖將用作應用程序中某些頁面的標題。 自定義視圖具有用於保存信息的按鈕,以及用於顯示是否已保存信息的圖像,但是如果已保存信息,我也可以從API接收信息。 (這是該方案的簡化版本)

因此,我擁有MainPage.xaml(將使用自定義視圖的任何頁面)

ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:Messages"
         xmlns:controls="clr-namespace:Messages.Controls"
         x:Class="Messages.MainPage">
<StackLayout Spacing="5">

    <controls:HeaderMenu x:Name="menu" HorizontalOptions="FillAndExpand" VerticalOptions="Start" SaveCommand="{Binding MyCommand}" IsControlClosed="{Binding ControlClosedValue, Mode=TwoWay}" />

    .....

</StackLayout>

MainPageViewModel.cs

public class MainPageViewModel : INotifyPropertyChanged
{
    public ICommand MyCommand { get; set; }

    private bool _controlClosedvalue;

    public bool ControlClosedValue
    {
        get => _controlClosedvalue;
        set
        {
            _controlClosedvalue = value;
            OnPropertyChanged(nameof(ControlClosedValue));
        }
    }

    public MainPageViewModel()
    {
        MyCommand = new Command(MyCommandExecute);
        _controlClosedvalue = false;
    }

    private void MyCommandExecute()
    {
        // do stuff

        _controlClosedvalue = true; //change value to change the value of control
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

HeaderMenu.xaml

<Grid>   

<Image Source="save.png" HeightRequest="25" WidthRequest="25">
                    <Image.GestureRecognizers>
                        <TapGestureRecognizer NumberOfTapsRequired="1" Tapped="SaveImage_OnTapped" />
                    </Image.GestureRecognizers>
                </Image>

 <Image  IsVisible="{Binding IsControlClosed}" Source="check.png" HeightRequest="30" WidthRequest="30" />

HeaderMenu.xaml.cs

public partial class HeaderMenu : ContentView
{
    public HeaderMenu ()
    {
        InitializeComponent();
        imgControlClosed.BindingContext = this;
    }

    public static readonly BindableProperty SaveCommandProperty =
        BindableProperty.Create(nameof(SaveCommand), typeof(ICommand), typeof(HeaderMenu));

    public static readonly BindableProperty IsControlClosedProperty =
        BindableProperty.Create(nameof(IsControlClosed), typeof(bool), typeof(HeaderMenu), false, BindingMode.TwoWay, null, ControlClosed_OnPropertyChanged);

    public ICommand SaveCommand
    {
        get => (ICommand) GetValue(SaveCommandProperty);
        set => SetValue(SaveCommandProperty, value);
    }

    public bool IsControlClosed
    {
        get => (bool) GetValue(IsControlClosedProperty);
        set => SetValue(IsControlClosedProperty, value);
    }

    private static void ControlClosed_OnPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if (bindable is HeaderMenu control)
        {
            control.imgControlClosed.IsVisible = (bool)newValue;
        }
    }

    private void SaveImage_OnTapped(object sender, EventArgs e)
    {
        if (SaveCommand != null && SaveCommand.CanExecute(null))
        {
            SaveCommand.Execute(null);
        }
    }
}

因此,我需要的是,當點擊save命令以執行使用控件的頁面中的某些代碼時,SaveCommand的綁定將按預期工作。 但是在執行代碼后或在某些不同情況下,我希望更改頁面模型中的屬性,並且這應該更改自定義視圖上的屬性,但這不起作用。

有人知道這段代碼有什么問題嗎?

如果我在使用控件時僅輸入True或False,則它起作用。

<controls:HeaderMenu x:Name="menu" HorizontalOptions="FillAndExpand" VerticalOptions="Start" SaveCommand="{Binding MyCommand}" IsControlClosed="True" />

但是將其綁定到屬性時不起作用。

我發現了一個問題。 一個愚蠢的錯誤,我正在設置變量的值而不是屬性。

在主頁視圖模型中,代替

_controlClosedvalue = false; // or true

它應該是

ControlClosedValue = false; // or true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM