2017-01-31 2 views
1

Ich mache eine einfache Wetter App. Und jetzt möchte ich es ändern. Ich möchte einen Befehl zu einer Schaltfläche implementieren, und wenn gedrückt wird, wird ein TextBlock mit Wetterinformationen aktualisiert, aber ich kann nicht auf Eigenschaft von TextBlock zugreifen. HierSo ändern Sie die Texteigenschaft mit ICommand C# XAML

ist die Command Klasse von Models:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Input; 

namespace RemakeWindowsWeather.Models 
{ 
    public class Command : ICommand 
    { 
     public event EventHandler CanExecuteChanged; 

     Func<object, bool> canExecuteMethod; 
     Action<object> executeMethod; 


     public Command(Func<object, bool> canExecuteMethod, Action<object> executeMethod) 
     { 
      this.canExecuteMethod = canExecuteMethod; 
      this.executeMethod = executeMethod; 
     } 

     public bool CanExecute(object parameter) 
     { 
      return canExecuteMethod(parameter); 
     } 

     public void Execute(object parameter) 
     { 
      executeMethod(parameter); 

     } 
    } 
} 

Hier ist die Klasse von Viewmodels, wo ich will die Eigenschaft TextBlock- ändern:

using RemakeWindowsWeather.Models; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace RemakeWindowsWeather.ViewModels 
{ 
    public class CommandViewModel 
    { 
     Command ShowWeather { get; set; } 

     public CommandViewModel() 
     { 
      ShowWeather = new Command(canExecuteMethod, executeMethod); 
     } 


     private bool canExecuteMethod(object parameter) 
     { 
      return true; 
     } 
     private async void executeMethod(object parameter) 
     { 
      var pos = await LocationManager.GetLocation(); 

      var lat = pos.Coordinate.Latitude; 
      var lon = pos.Coordinate.Longitude; 

      var weather = await WeatherProxyMap.GetWeather(lon, lat); 

      //HERE.. not working 
      WeatherCondition.Text = weather.main.temp + " " + weather.name; 

     } 



    } 
} 

Hier wird die XAML:

<Page 
x:Class="RemakeWindowsWeather.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:RemakeWindowsWeather" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
x:Name="MyPage"> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel> 
     <Button Height="30" 
       Width="120" 
       Click="Button_Click" 
       Content="Get Weather"/> 
     <TextBlock Name="WeatherCondition" 
        Margin="0,20,0,20"/> 
     <TextBox Name="CitySearch" 
       PlaceholderText="Search for weather.." 
       Margin="0,20,0,20"/> 
     <Button Width="120" 
       Height="30" 
       Click="Button_Click_1" 
       Content="Get Weather"/> 
     <TextBlock Name="CityNameTxtBlock"/> 
    </StackPanel> 
</Grid> 

+0

Fehle ich hier etwas? Was ist deine Frage? –

+0

Der Befehl sollte nicht auf eines Ihrer Ansichtselemente zugreifen können. Stattdessen sollte der Befehl eine Eigenschaft für Ihr (Ansichts-) Modell festlegen, an das die Ansicht gebunden ist. – user3292642

+0

WeatherCondition.Text = weather.main.temp + "" + weather.name; –

Antwort

2

Sie müssen Ihren Befehl vom Ansichtsmodell in XAML binden und stattdessen Ereignishandler in der Ansicht verwenden.

<Button Width="120" 
    Height="30" 
    Command="{Binding ShowWeather}" 
    Content="Get Weather"/> 

Auch sollte der Befehl öffentlich sein und Sie benötigen eine Texteigenschaft

public Command ShowWeather { get; set; } 

public string WeatherText { get; set; } 

Sie brauchen dann den Text aus dem Viewmodel in der Ansicht zu binden.

<TextBlock Name="WeatherCondition" Margin="0,20,0,20" Text="{Binding WeatherText}"/> 

auch müssen Sie INotifyPropertyChanged im Ansichtsmodell implementieren und es nennt, wenn Sie den Text ändern.

WeatherText= weather.main.temp + " " + weather.name; 
this.RaisePropertyChanged("WeatherText"); 

Diese ziemlich grundlegende MVVM, die Sie von here lesen können.

+0

Arbeit! vielen Dank ! –

Verwandte Themen