2017-12-03 283 views
0

我有这样如何从结构写入Xaml页面文本框的Int值?

struct struValues 
{ 
public int a; 
} 

我想将它写在XAML页面中的textcell的结构。我该怎么做? 我试过

{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示例。 我对重要的文章发表了评论。

视觉结果应该是一个表格视图,其中一个标题为“Cool Struct Section”的部分和一个Text Cell作为子标题,显示文本“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)); 
     } 
    } 
} 
相关问题