我有一些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));
}
2条答案
按热度按时间zynd9foi1#
调用
Visibility
,而不是_visibility
,或者手动触发OnPropertyChanged
。但是首选第一个选项。顺便说一句,我不知道你的OnPropertyChanged
实现是什么,但是通常用你的属性名调用它,如@Maniax提到的,或者使用nameof
操作符,例如OnPropertyChanged(nameof(Visibility))
6ovsh4lw2#
首先,PropetyChanged接受一个参数,
我想这应该可以工作,但是把你的ViewModel代码放在后面的代码中是很奇怪的。
MVVM的思想是将逻辑从一个页面移动到另一个ViewModel,从而允许您在同一个ViewModel中管理多个页面的状态,而在XAML后面的页面中几乎没有代码。
因此,您可能应该创建另一个名为ViewModel的文件,并将业务逻辑放入其中。
在MyViewModel.cs中:
因此您可以处理任何您想要的装订,并在不同的页面中轻松使用它们。
我希望这能帮上忙。