2017-10-27 2 views
-1

DetailPage을 다시 초기화하는 방법을 알고 있습니까? Button.Clicked 이벤트가이 페이지에 있습니까?버튼 클릭 이벤트로 세부 정보 페이지를 다시 초기화 (재설정) 하시겠습니까?

내 문제는 "Senden"을 클릭 한 후 필드를 재설정하여 ErrorSuccess 사진도 재설정된다는 것입니다. 내가 사용한 Behaviors 때문에 위의 두 버튼 (QR 코드 읽기 및 여섯 자리 숫자 얻기)의 값에는 작동하지 않습니다. Clicked-Event를 트리거로 사용하는 버튼 비헤이비어. 두 번째 그림에서 볼 수있는 결과입니다. picture 2

picture 1

은 그래서 기본에 가서 당신에게 단순히 "Senden"-Button 타격이 ​​페이지를 다시 초기화 할 수있는 방법들 물어보고 싶은. Navigation-Stacks에 대해서 알고 있습니다 ... 왜냐하면 그 때문에 Hamburger Menu이 사라질 것이기 때문에 이것은 선택 사항이 아닙니다. 여기

페이지의 XAML 코드입니다 :

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:local="clr-namespace:TDE" 
      Title="Tankerfassung" 
      x:Class="TDE.TDE"> 
    <ContentPage.Resources> 
     <ResourceDictionary> 
      <local:BooleanToObjectConverter x:Key="boolToStyleImage" 
               x:TypeArguments="Style"> 
       <local:BooleanToObjectConverter.FalseObject> 
        <Style TargetType="Image"> 
         <Setter Property="HeightRequest" Value="30" /> 
         <Setter Property="Source" Value="error.png" /> 
        </Style> 
       </local:BooleanToObjectConverter.FalseObject> 

       <local:BooleanToObjectConverter.TrueObject> 
        <Style TargetType="Image"> 
         <Setter Property="HeightRequest" Value="30" /> 
         <Setter Property="Source" Value="success.png" /> 
        </Style> 
       </local:BooleanToObjectConverter.TrueObject> 
      </local:BooleanToObjectConverter> 

      <local:MultiTriggerConverterFahrer x:Key="dataHasBeenEnteredFahrer" /> 
      <local:MultiTriggerConverterFahrzeugGeraet x:Key="dataHasBeenEnteredFahrzeugGeraet" /> 
      <local:MultiTriggerConverterKraftstoffmenge x:Key="dataHasBeenEnteredKraftstoffmenge" /> 
      <local:MultiTriggerConverterKmStd x:Key="dataHasBeenEnteredKmStd" /> 
      <local:MultiTriggerConverterTankbombe x:Key="dataHasBeenEnteredTankbombe" /> 
      <local:MultiTriggerConverterTankbombeButton x:Key="dataHasBeenEnteredTankbombeButton" /> 
      <local:MultiTriggerConverterFahrzeugGeraetButton x:Key="dataHasBeenEnteredFahrzeugGeraetButton" /> 


    </ResourceDictionary> 
    </ContentPage.Resources> 
    <ContentPage.Content> 
     <ScrollView> 
      <Grid Padding="20"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="100" /> 
        <RowDefinition Height="100" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="*" /> 
       </Grid.RowDefinitions> 

       <!--Button Tankbombe Scannen--> 
       <Button x:Name="buttonTankbombeScannen" 
         Text="Tankbombe Scannen" 
         FontSize="20" 
         FontAttributes="Bold" 
         Margin="0,10,0,10" 
         BackgroundColor="#004d93" 
         TextColor="White" 
         Grid.Row="0" 
         Grid.ColumnSpan="2"> 
        <Button.Behaviors> 
         <local:TankbombeValidatorBehaviorButton x:Name="tankbombeValidatorBehaviorButton"/> 
        </Button.Behaviors> 
       </Button> 
       <Image Grid.Column="2" 
        Grid.Row="0" 
         Margin="0,10,0,10" 
        x:Name="buttonTankbombeScannenSuccessErrorImage" 
        Style="{Binding Source={x:Reference tankbombeValidatorBehaviorButton}, Path=IsValid, Converter={StaticResource boolToStyleImage}}"/> 

        <!--Button Fahrzeug Scannen--> 
       <Button x:Name="buttonFahrzeugGeraetScannen" 
         Text="Fahrzeug/Gerät Scannen" 
         FontSize="20" 
         FontAttributes="Bold" 
         Margin="0,10,0,10" 
         BackgroundColor="#004d93" 
         TextColor="White" 
         Grid.Row="1" 
         Grid.ColumnSpan="2"> 
        <Button.Behaviors> 
         <local:FahrzeugGeraetValidatorBehaviorButton x:Name="fahrzeugGeraetValidatorBehaviorButton"/> 
        </Button.Behaviors> 
       </Button> 
       <Image Grid.Column="2" 
        Grid.Row="1" 
         Margin="0,10,0,10" 
        x:Name="buttonFahrzeugGeraetScannenSuccessErrorImage" 
        Style="{Binding Source={x:Reference fahrzeugGeraetValidatorBehaviorButton}, Path=IsValid, Converter={StaticResource boolToStyleImage}}"/> 

       <!--Entry Kraftstoffmenge--> 
       <Entry x:Name="entryKraftstoffmenge" 
         Placeholder="Getankte Kraftstoffmenge" 
         PlaceholderColor="#004d93" 
         FontSize="15" 
         Margin="0,10,0,10" 
         FontAttributes="Bold" 
         HorizontalTextAlignment="End" 
         Grid.Row="2" 
         Grid.Column="0" 
         Keyboard="Numeric"> 
         <Entry.Behaviors> 
          <local:KraftstoffmengeValidatorBehavior x:Name="kraftstoffmengeValidator"/> 
         </Entry.Behaviors> 
        </Entry> 
       <Label Grid.Column="1" 
         Grid.Row="2" 
         Text="Liter" 
         Margin="0,10,0,10" 
         HorizontalOptions="Start" 
         VerticalOptions="Center" 
         HorizontalTextAlignment="Start"/> 
       <Image Grid.Column="2" 
        Grid.Row="2" 
         Margin="0,10,0,10" 
        x:Name="kraftstoffmengeSuccessErrorImage" 
        Style="{Binding Source={x:Reference kraftstoffmengeValidator}, Path=IsValid, Converter={StaticResource boolToStyleImage}}"/> 

       <!--Entry Kilometer/Stunden--> 
       <Entry x:Name="entryKmStd" 
         Placeholder="KM-Stand oder Stunden" 
         PlaceholderColor="#004d93" 
         FontSize="15" 
         Margin="0,10,0,10" 
         FontAttributes="Bold" 
         HorizontalTextAlignment="End" 
         Grid.Row="3" 
         Grid.Column="0" 
         Keyboard="Numeric"> 
        <Entry.Behaviors> 
         <local:KmStdValidatorBehavior x:Name="kmStdValidator"/> 
        </Entry.Behaviors> 
       </Entry> 
       <Label Grid.Column="1" 
         Grid.Row="3" 
         Margin="0,10,0,10" 
         Text="KM/Stunden" 
         HorizontalOptions="Start" 
         VerticalOptions="Center" 
         HorizontalTextAlignment="Start"/> 
       <Image Grid.Column="2" 
        Grid.Row="3" 
         Margin="0,10,0,10" 
        x:Name="kmStdSuccessErrorImage" 
        Style="{Binding Source={x:Reference kmStdValidator}, Path=IsValid, Converter={StaticResource boolToStyleImage}}"/> 

       <!--Entry Fahrername--> 
       <Entry x:Name="entryFahrer" 
         Placeholder="Ihr Name oder Kürzel" 
         PlaceholderColor="#004d93" 
         Margin="0,10,0,10" 
         FontSize="15" 
         FontAttributes="Bold" 
         HorizontalTextAlignment="Center" 
         Grid.Row="4" 
         Grid.ColumnSpan="2"> 
        <Entry.Behaviors> 
         <local:FahrerValidatorBehavior x:Name="fahrerValidator"/> 
        </Entry.Behaviors> 
       </Entry> 
       <Image Grid.Column="2" 
         Margin="0,10,0,10" 
        Grid.Row="4" 
        x:Name="fahrerSuccessErrorImage" 
        Style="{Binding Source={x:Reference fahrerValidator}, Path=IsValid, Converter={StaticResource boolToStyleImage}}"/> 

       <!--Button Vorgang Abschliessen--> 
       <Button x:Name="buttonAbschliessen" 
         Text="Senden" 
         FontSize="25" 
         FontAttributes="Bold" 
         BackgroundColor="Green" 
         Margin="0,10,0,10" 
         TextColor="White" 
         IsEnabled="False" 
         Clicked="buttonAbschliessen_Clicked" 
         Opacity="0.3" 
         Grid.Row="5" 
         Grid.ColumnSpan="3"> 
        <Button.Triggers> 
         <MultiTrigger TargetType="Button"> 
          <MultiTrigger.Conditions> 
           <BindingCondition Binding="{Binding Source={x:Reference entryFahrer}, Path=Text.Length, Converter={StaticResource dataHasBeenEnteredFahrer}}" Value="true"/> 
           <BindingCondition Binding="{Binding Source={x:Reference entryKraftstoffmenge}, Path=Text.Length, Converter={StaticResource dataHasBeenEnteredKraftstoffmenge}}" Value="true"/> 
           <BindingCondition Binding="{Binding Source={x:Reference entryKmStd}, Path=Text.Length, Converter={StaticResource dataHasBeenEnteredKmStd}}" Value="true"/> 
           <BindingCondition Binding="{Binding Source={x:Reference buttonTankbombeScannen}, Path=Text, Converter={StaticResource dataHasBeenEnteredTankbombeButton}}" Value="true"/> 
           <BindingCondition Binding="{Binding Source={x:Reference buttonFahrzeugGeraetScannen}, Path=Text, Converter={StaticResource dataHasBeenEnteredFahrzeugGeraetButton}}" Value="true"/> 
          </MultiTrigger.Conditions> 
          <Setter Property="IsEnabled" Value="True"/> 
          <Setter Property="Opacity" Value="1"/> 
         </MultiTrigger> 
        </Button.Triggers> 
       </Button> 
      </Grid> 
     </ScrollView> 
    </ContentPage.Content> 
</ContentPage> 

페이지 뒤에 코드 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using TDE.ViewModels; 
using Xamarin.Forms; 
using Xamarin.Forms.Xaml; 

namespace TDE 
{ 
    [XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class TDE : ContentPage 
    { 
     public TDE() 
     { 
      InitializeComponent(); 
      BindingContext = new AddTankerfassungViewModel(); 
     } 

     private void buttonAbschliessen_Clicked(object sender, EventArgs e) 
     { 
      AddTankerfassungViewModel.tankerfassung.mTDE = false; 
      Email.SendeEmail(); 
      ResetPage(); 
     } 

     public void ResetPage() 
     { 
      entryFahrer.Text = null; 
      buttonTankbombeScannen.Text = "Tankbombe Scannen"; 
      entryKmStd.Text = null; 
      entryKraftstoffmenge.Text = null; 
      buttonFahrzeugGeraetScannen.Text = "Fahrzeug/Gerät Scannen"; 
      AddTankerfassungViewModel.tankerfassung.Tankbombe = null; 
      AddTankerfassungViewModel.tankerfassung.IsValidFahrer = false; 
      AddTankerfassungViewModel.tankerfassung.IsValidFahrzeugGeraet = false; 
      AddTankerfassungViewModel.tankerfassung.IsValidKmStd = false; 
      AddTankerfassungViewModel.tankerfassung.IsValidKraftstoffmenge = false; 
      AddTankerfassungViewModel.tankerfassung.IsValidTankbombe = false; 
     } 
    } 
} 

과 행동 중 하나를 heres 코드 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 
using TDE.ViewModels; 
using Xamarin.Forms; 
using ZXing.Mobile; 

namespace TDE 
{ 
    public class TankbombeValidatorBehaviorButton : Behavior<Button> 
    { 
     static readonly BindablePropertyKey IsValidPropertyKey = BindableProperty.CreateReadOnly("IsValid", typeof(bool), typeof(bool), false); 

     public static readonly BindableProperty IsValidProperty = IsValidPropertyKey.BindableProperty; 

     public bool IsValid 
     { 
      get { return (bool)base.GetValue(IsValidProperty); } 
      private set 
      { 
       base.SetValue(IsValidPropertyKey, value); 
       if (value) 
       { 
        AddTankerfassungViewModel.tankerfassung.IsValidTankbombe = true; 
       } 
       else 
       { 
        AddTankerfassungViewModel.tankerfassung.IsValidTankbombe = false; 
       }; 
      } 
     } 

     protected override void OnAttachedTo(Button bindable) 
     { 
      bindable.Clicked += HandleTextChanged; 
     } 

     async void HandleTextChanged(object sender, EventArgs e) 
     { 
      if (AddTankerfassungViewModel.tankerfassung.Tankbombe != null) 
      { 
       var scanner = new MobileBarcodeScanner(); 
       var result = await scanner.Scan(); 
       if (result != null) 
       { 
        if (result.Text.ToString() == "691316" || result.Text.ToString() == "691141") 
        { 
         AddTankerfassungViewModel.tankerfassung.Tankbombe = result.Text.ToString(); 
         AddTankerfassungViewModel.tankerfassung.IsValidTankbombe = true; 
        } 
        else 
        { 
         AddTankerfassungViewModel.tankerfassung.Tankbombe = result.Text.ToString(); 
         AddTankerfassungViewModel.tankerfassung.IsValidTankbombe = false; 
        } 
       } 
      } 
       IsValid = Validierung.ValidiereTankbombe(AddTankerfassungViewModel.tankerfassung.Tankbombe); 
       ((Button)sender).Text = IsValid ? "Tankbombe: " + AddTankerfassungViewModel.tankerfassung.Tankbombe : "Ungültig. Neu Scannen!"; 
     } 
     protected override void OnDetachingFrom(Button bindable) 
     { 
      bindable.Clicked -= HandleTextChanged; 
     } 
    } 
} 

문제는 버튼 클릭 이벤트가 한 번만 발생하므로 동작이 한 번만 발생한다는 것입니다. 다른 방법이 필요합니다.

내가 XAML에서 명령을 결합하려고 노력하지만 내 multitrigger 난 당신이 MVVM에 대해 뭔가를 잘못있어 생각 ... 더 이상

+1

스크린 샷이 아닌 코드 메이트를 보여줍니다. – SeM

+1

전체 페이지를 다시 초기화하여 손쉬운 해결 방법을 얻으려고한다고 생각하지만 앱 성능에 좋지 않습니다. SeM이 제안한대로 코드를 보여 주시면 도와 드리겠습니다! :) –

답변

1

일을 didnt한다. MVVM의 좋은 점은 당신이 당신이 지금에 유효성 검사를 수행 할 수의 ViewModel에서 뷰 모델

<Entry x:Name="entryKraftstoffmenge" Text="{Binding Kraftstoffmenge}" ... > 
    ... 
</Entry> 

의 특성에 컨트롤을 당신의 ContentPage

<ContentPage.BindingContext> 
    <local:AddTankerfassungViewModel /> 
    <!-- assumes that you have a parameter-less constructor --> 
</ContentPage.BindingContext> 

BindingContext을 설정 한 다음 결합 할 수있다 상기 방법은 ValidateKraftstoffmengeKraftstoffmenge를 검증하고 01으로 설정

public double Kraftstoffmenge 
{ 
    get => _kraftstoffmenge; // C# 7.0 
    set 
    { 
     if(_value == _kraftstoffmenge) return; 

     _kraftstoffmenge = value; 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Kraftstoffmenge))); 
     ValidateKraftstoffmenge(); 
    } 
} 

속성 세터 유효성 검사 결과에 따라.

반면에 검증 결과 이미지는 당신의 ViewModel에 Command에 바인딩 또한 KraftstoffmengeIsValid

<Image Style="{Binding KraftstoffmengeIsValid, 
         Converter={StaticResource boolToStyleImage}}"/> 

Button.Command에 바인딩 정의 다음과 같은 라인을 따라 뭔가를 구현

<Button Command={Binding SendCommand} ... /> 

public Command SendCommand { get; private set; } 

public AddTankerfassungViewModel(/* ... */) 
{ 
    // ... 
    SendCommand = new Command(OnSend); 
} 

private void OnSend() 
{ 
    SendDataViaEmail(); // whatever 
    ResetFields(); 
} 

private void ResetFields() 
{ 
    Kraftstoffmenge = .0; // or whatever 
    // reset other fields 
} 

여기에는 몇 가지 장점이 있습니다. 우선 XAML이 더 깨끗해집니다.모든 행동을 제거하고 뒤에있는 코드를 사용하여 필드를 다시 설정합니다. 클릭을 처리하는 방법은 하나 뿐이며 더 이상 두 개가 아닙니다. 또한 코드를 더 잘 테스트 할 수 있습니다. 귀하의 솔루션은 코드 뒤에 논리와 동작을 전반적으로 나타냅니다. MVVM을 사용하면 깔끔하게 테스트 할 수있는 로직을 한 곳에서 사용할 수 있습니다 (뷰 모델에 유효성 검사기를 도입하고 모의 테스트하고 모든 것을 개별적으로 테스트 할 수 있음).

+0

답변을 주셔서 대단히 감사합니다, 나중에 시간이있을 때 나는 더 깊은 모습을 보일 것입니다! 하지만 정말 도움이되는 소리, 감사합니다! – paulvoelker

+0

안녕하세요, @paul kertscher 있습니까? 나는 당신의 방식으로 그것을했고 분명히 작동하지만 booltoimage 기능이 작동하지 않습니다 ... 제발 나를 도울 수 있습니까? 다른 코드는 여기에 게시 할 수 없습니다. 어쩌면 이메일 주소로? 안부, 폴 – paulvoelker

관련 문제