Xamarinフォームのカスタムビューのデータを含むページのビューモデルにデータをバインドする際に問題が発生しました。次のようにこれは、ページ内で消費されるXamarin.Formsでカスタムビューをバインドする
public partial class KeyValueView : ContentView
{
public KeyValueView()
{
InitializeComponent();
this.VerticalOptions = LayoutOptions.Start;
this.BindingContext = this;
}
public static readonly BindableProperty ValueProperty =
BindableProperty.Create<KeyValueView, string>(w => w.Value, default(string));
public string Value
{
get {return (string)GetValue(ValueProperty);}
set {SetValue(ValueProperty, value);}
}
public static readonly BindableProperty KeyProperty =
BindableProperty.Create<KeyValueView, string>(w => w.Key, default(string));
public string Key
{
get {return (string)GetValue(KeyProperty);}
set {SetValue(KeyProperty, value);}
}
}
:背後にあるコードで
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="KeyValueView">
<Grid VerticalOptions="Start">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label x:Name="KeyLabel" Text="{Binding Key}" Grid.Column="0" HorizontalOptions="Start" />
<Label x:Name="ValueLabel" Text="{Binding Value}" Grid.Column="1" HorizontalOptions="EndAndExpand" />
</Grid>
</ContentView>
:
私のカスタムビューは、キーと値のペアを表すラベルのペアは非常に簡単です
<views:KeyValueView Key="Order Number" Value="{Binding document_number}" />
問題は、Key文字列が期待どおりに表示されるが、値文字列が表示されないことです。 私はdocument_numberプロパティでPropertyChangedイベントを強制しようとしましたが、これは役に立ちませんでした。 私も明示的にカスタムビューのキー/値のプロパティのセッター中にラベル上のTextプロパティを設定しようとしている:
public string Key
{
get {return (string)GetValue(KeyProperty);}
set {
SetValue(KeyProperty, value);
KeyLabel.Text = value;
}
}
ここでも、これは助けていない、セッターのコードが実行され得るように見えることはありません(Iそれにブレークポイントを置いて、私は、そのようなページ内のプロパティに直接結合した標識としてボックスコントロールのうちを追加した場合、それは)
をヒットしていなかった、これは正しく表示されます。
<Label Text="{Binding document_number}"/>
<views:KeyValueView Key="Order Number" Value="{Binding document_number}" />
は誰でもできなぜこれが起こっているのかを説明してください(またはむしろ起こっていない)?
これは私が必要としていたものです。バインド可能なプロパティがたくさんあるカスタムビューでは少し面倒かもしれませんが、私がそのポイントに達するとリファクタリングを見ていきます。 – MikeW
偉大な答えです。それは魅力のように働く。 –
propertyChanged:BindablePropertyからスタティックに、カスタムプロパティの全体的な点が再利用され、この静的メソッドではカスタム要素は1つしか使用できませんが、あなたのソリューションは魅力的に機能します – dpineda