2017-10-27 4 views
0

응용 프로그램의 일부 페이지에서 헤더로 사용될 사용자 정의보기를 작성하려고합니다. 맞춤보기에는 정보를 저장하는 버튼과 정보가 저장된 경우 표시 할 이미지가 있지만 정보가 저장된 경우 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" /> 

하지만 속성에 바인딩 할 때 작동하지 않습니다.

+0

다른 경우, 페이지 모델에서 속성을 변경하고 싶습니다. 그러면 사용자 정의보기의 속성이 변경되어야하지만 작동하지 않습니다 ._. 설명 할 수 있니? –

+0

SaveCommand 코드가 실행 된 후 ControlClosedValue 값을 변경하고 바인딩을 통해 머리글 메뉴의 속성 값을 변경하려고합니다. 어쨌든, 고마워, 주셔서 감사합니다,하지만 오류를 발견하고 게시했습니다. – user2081328

답변

0

문제점을 발견했습니다. 바보 같은 실수, 나는 속성 대신 변수의 값을 설정했다. 메인 페이지 뷰 모델에서

, 대신
_controlClosedvalue = false; // or true 

이 있어야한다

ControlClosedValue = false; // or true 
나는 코드가 실행 또는 일부 후 당신이 _But 말할 때 당신이 무슨 뜻인지 알아 보았 수 없습니다
관련 문제