gpt4 book ai didi

c# - 在 Xamarin.Forms 中绑定(bind)自定义 View

转载 作者:可可西里 更新时间:2023-11-01 08:04:43 25 4
gpt4 key购买 nike

我在将 Xamarin 表单中的自定义 View 中的数据绑定(bind)到包含页面的 View 模型时遇到问题。

我的自定义 View 很简单,一对标签代表一个键值对:

<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>

后面的代码:

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);}
}
}

这在页面中使用如下:

<views:KeyValueView Key="Order Number" Value="{Binding document_number}" />

问题是 Key 字符串按预期显示,但 value 字符串没有显示。我曾尝试在 document_number 属性上强制执行 PropertyChanged 事件,但这没有帮助。我还尝试在自定义 View 的键/值属性的 setter 中显式设置标签上的文本属性:

public string Key
{
get {return (string)GetValue(KeyProperty);}
set {
SetValue(KeyProperty, value);
KeyLabel.Text = value;
}
}

同样这没有帮助,setter 代码似乎永远不会被执行(我在上面放置了一个断点但它没有被命中)

如果我添加一个开箱即用的控件,例如直接绑定(bind)到页面中的属性的 Label,它会正确显示:

<Label Text="{Binding document_number}"/>
<views:KeyValueView Key="Order Number" Value="{Binding document_number}" />

谁能解释为什么会发生(或者更确切地说没有发生)?

最佳答案

不要在自定义控件内部分配绑定(bind)。使用这个:

public partial class KeyValueView : ContentView
{
public KeyValueView()
{
InitializeComponent();
this.VerticalOptions = LayoutOptions.Start;
}

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);}
}
protected override void OnPropertyChanged(string propertyName)
{
base.OnPropertyChanged(propertyName);

if (propertyName == ValueProperty.PropertyName)
{
ValueLabel.Text = Value;
}
if (propertyName == KeyProperty.PropertyName)
{
KeyLabel.Text = Key;
}
}
}

<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" Grid.Column="0" HorizontalOptions="Start" />
<Label x:Name="ValueLabel" Grid.Column="1" HorizontalOptions="EndAndExpand" />
</Grid>
</ContentView>

将属性(例如值)视为对 BindableProperty (ValueProperty) 的引用。如果您在 Value setter 中执行某些操作,BindableProperty 将不会收到通知,相反,如果您使用 BindableProperty 执行某些操作(分配/更改 ValueProperty)- 属性 Value setter 将不会被调用。

如果你想处理 PropertyChanged,你有一个覆盖 (OnPropertyChanged) 或 Actions(作为创建 BindableProperty 时的附加参数)。

关于c# - 在 Xamarin.Forms 中绑定(bind)自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32606513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com