2017-12-03 20 views
0

私は、XAMLページ内textcellにそれを書きたい、この構造体からXamlページのテキストボックスにInt値を書き込む方法は?

struct struValues 
{ 
public int a; 
} 

のような構造を有しています。どうしたらいいですか? 私は

{Bind struValues.a} 

をしようとしたが、それは働いていませんでした。

<?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:i18n="clr-namespace:test_Trade.Localization;assembly=test_Trade" 
      xmlns:puser="clr-namespace:test_Trade.Classes" 
      x:Class="test_Trade.Views.Durumpg"> 
    <ContentPage.Content> 
     <TableView Intent="Form"> 
      <TableRoot> 
       <TableSection Title="{i18n:TranslateExtension Text=Stats}"> 
        <ImageCell ImageSource="Euro.png" Detail="{Here Should be money}" x:Name="imgCelleuro"/> 

       </TableSection> 
      </TableRoot> 
     </TableView> 
    </ContentPage.Content> 
</ContentPage> 
+0

?問題を再現するのに必要な最短コードを含めるようにしてください。参照:[mcve] –

+0

私は知らない、テキストが空になります。私はxlmnsのような何かをするべきですか? –

+0

XAMLの簡略化されたバージョンを問題に再現するだけで問題に再現します。 –

答えて

0

ここでは、TextCell "Text"プロパティを構造体型インスタンスのintプロパティにバインドする方法のMVVMの例を示します。 重要な行にコメントを付ける。

視覚的結果は、1つのセクションがCool構造セクションで、1つのテキストセルが子として表示され、構造体の現在の値であるテキスト「123」を表示するテーブルビューでなければなりません。

XAMLページコンテンツ:後ろ

<ContentPage.Content> 
     <TableView Intent="Settings"> 
      <TableRoot> 
       <TableSection Title="{Binding TableSectionTitle}"> 
        <TextCell Text="{Binding StruValues.A}" /> 
       </TableSection> 
      </TableRoot> 
     </TableView> 
</ContentPage.Content> 

C#ページコード:

using MVVMExample.ViewModel; 
using Xamarin.Forms; 
using Xamarin.Forms.Xaml; 

namespace MVVMExample 
{ 
    [XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class TableViewPage : ContentPage 
    { 
     public TableViewPage() 
     { 
      InitializeComponent(); 
      BindingContext = new TableViewPageVM(); //Assing the ViewModel to the binding context! 
     } 
    } 
} 

C#ビューモデル(ページのもBindingContextを)

using MVVMExample.Utils; 

namespace MVVMExample.ViewModels 
{ 
    public class TableViewPageVM : BindableBase 
    { 
     //Simple text to bind to the TableSection Title property 
     private string tableSectionTitle; 
     public string TableSectionTitle { get { return tableSectionTitle; } set { SetProperty(ref tableSectionTitle, value); } } 

     //Property that will hold our struValues instance. The TextCell "Text" Property will be bound to the A property of this instance. 
     //The A property exposes the value of the actual "a" property of the facades struct instance 
     private struValuesFacade _struValues; 
     public struValuesFacade StruValues { get { return _struValues; } set { SetProperty(ref _struValues, value); } } 

     public TableViewPageVM() 
     { 
      TableSectionTitle = "Cool Struct Section"; //Set the title text 
      StruValues = new struValuesFacade(123);  //Create an instance of our facade 
     } 

     /// <summary> 
     /// A "facade" of the actual struct, that exposes the "a" property of the struct instance 
     /// Also holds the instances of the struct 
     /// </summary> 
     public class struValuesFacade : BindableBase 
     { 
      struValues origin; 
      public int A 
      { 
       get { return origin.a; } 
       set 
       { 
        SetProperty(ref origin.a, value); 
       } 
      } 

      public struValuesFacade(int value) 
      { 
       origin = new struValues() { a = value }; 
      } 
     } 

     /// <summary> 
     /// Your beloved struct 
     /// </summary> 
     struct struValues 
     { 
      public int a; 
     } 
    } 
} 

C#の "BindableBase" クラスは、INotifyPropertyChangedのから継承(msdn.microsoft.comにクレジット) (プロパティがMVVM環境で変更されたときにビューを更新することは必須)、それは動作しませんでしたどのように

using System.ComponentModel; 
using System.Runtime.CompilerServices; 

namespace MVVMTest.Utils 
{ 
    public class BindableBase : INotifyPropertyChanged 
    { 
     /// 
     /// Multicast event for property change notifications. 
     /// 
     public event PropertyChangedEventHandler PropertyChanged; 

     /// 
     /// Checks if a property already matches a desired value. Sets the property and 
     /// notifies listeners only when necessary. 
     /// 
     ///Type of the property. 
     ///Reference to a property with both getter and setter. 
     ///Desired value for the property. 
     ///Name of the property used to notify listeners. This 
     /// value is optional and can be provided automatically when invoked from compilers that 
     /// support CallerMemberName. 
     ///True if the value was changed, false if the existing value matched the 
     /// desired value. 
     protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 
     { 
      if (object.Equals(storage, value)) return false; 

      storage = value; 
      this.OnPropertyChanged(propertyName); 
      return true; 
     } 

     /// 
     /// Notifies listeners that a property value has changed. 
     /// 
     ///Name of the property used to notify listeners. This 
     /// value is optional and can be provided automatically when invoked from compilers 
     /// that support . 
     protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
関連する問題