응용 프로그램의 일부 페이지에서 헤더로 사용될 사용자 정의보기를 작성하려고합니다. 맞춤보기에는 정보를 저장하는 버튼과 정보가 저장된 경우 표시 할 이미지가 있지만 정보가 저장된 경우 API에서 정보를받을 수도 있습니다.xamarin 양식의 페이지 모델에 사용자 정의보기 바인드
그래서, 내가 (사용자 정의보기를 사용하는 모든 페이지)
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에서 MainPage.xaml가 (이 시나리오의 단순화 된 버전입니다)
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);
}
}
}
는 명령을 저장할 때 컨트롤을 사용하는 페이지의 일부 코드를 실행하는 도청 및 SaveCommand의 결합 기대 작품으로이다 . 그러나 코드가 실행 된 후 또는 일부 다른 경우에 페이지 모델의 속성을 변경하려는 경우 사용자 정의보기의 속성이 변경되어야하지만 작동하지 않습니다.
누구든지이 코드의 문제점을 알고 있습니까?
컨트롤을 소비 할 때 참 또는 거짓을 넣으면 작동합니다.
<controls:HeaderMenu x:Name="menu" HorizontalOptions="FillAndExpand" VerticalOptions="Start" SaveCommand="{Binding MyCommand}" IsControlClosed="True" />
하지만 속성에 바인딩 할 때 작동하지 않습니다.
다른 경우, 페이지 모델에서 속성을 변경하고 싶습니다. 그러면 사용자 정의보기의 속성이 변경되어야하지만 작동하지 않습니다 ._. 설명 할 수 있니? –
SaveCommand 코드가 실행 된 후 ControlClosedValue 값을 변경하고 바인딩을 통해 머리글 메뉴의 속성 값을 변경하려고합니다. 어쨌든, 고마워, 주셔서 감사합니다,하지만 오류를 발견하고 게시했습니다. – user2081328