Прежде всего, PropetyChanged принимает аргумент,
OnPropertyChanged("Visibility");
Полагаю, это должно сработать, но странно помещать код ViewModel в код позади.
Идея MVVM состоит в том, чтобы переместить логику со страницы в ViewModel, что позволяет вам управлять состоянием нескольких страниц в одной и той же модели ViewM практически с, если не с кодом, на странице за 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");
}
}
Таким образом, вы можете иметь дело с любым желаемым переплетом и легко использовать их на разных страницах.
Надеюсь, это поможет.