将自定义视图绑定到 xamarin 表单中的页面模型

用户2081328

我正在尝试创建一个自定义视图,该视图将在应用程序的某些页面中用作标题。自定义视图有一个按钮来保存信息,还有一个图像来显示信息是否已保存,但如果信息已保存,我也可以从 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));
    }
}

标题菜单.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" />

但是将其绑定到属性时它不起作用。

用户2081328

我发现了问题所在。一个愚蠢的错误,我设置的是变量的值而不是属性。

在主页视图模型中,而不是

_controlClosedvalue = false; // or true

它应该是

ControlClosedValue = false; // or true

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Xamarin.Forms中绑定自定义视图

Xamarin表单中的视图到不同视图模型的绑定

如何将自定义Dependecy属性绑定到控件的视图模型?

如何在Xamarin表单中创建自定义可绑定视图?

在视图页面Xamarin中绑定多个模型

Aurelia自定义元素中的2种方式数据绑定-将自定义元素绑定到父视图模型

如何将自定义模型绑定到TextBoxFor

Xamarin表单自定义视图,可绑定的Observable集合<对象>引发“特定类型转换无效”

Xamarin自定义视图按钮绑定

将自定义控件的属性绑定到 WPF 中的页面

在 Xamarin Forms 中绑定自定义条目

自定义控件中的Xamarin.Forms绑定集合

如何将视图模型中的功能绑定到swiftui中的自定义视图?

如何将自定义对象列表绑定到 WPF 中的 DataGridComboboxColumn?

将自定义控件中的DependencyProperty绑定到ViewModel属性

如何将自定义UICollectinViewCell注册到在xib文件的自定义视图中内置的UICollectionView中

向 Xamarin 的 PDFTron.Android 中不起作用的页面添加自定义视图

如何从ui-router中的视图将自定义数据传递到状态?

如何将自定义错误绑定到angular5中的模板驱动表单输入字段

如何绑定到 C# Xamarin Forms 中的视图模型?

Xamarin表单:内容视图不会显示在内容页面中

Xaml绑定到Xamarin形式的自定义类

Xamarin:将参数从绑定传递到自定义控件

是否将自定义视图与模型信息同步?

Xamarin表单UWP自定义TabbedView

Xamarin 表单 - 自定义自动完成

在Xamarin表单中实施自定义Webview

如何在Xamarin表单中自定义标题模板

Xamarin表单中的自定义通用OnPlatform问题