将Xaml UserControl视图绑定到其背后的代码,但将代码背后绑定至其他对象

时间:2019-10-23 06:33:10

标签: c# xaml xamarin.forms data-binding binding

我有一个由Xaml定义的UserControl,后面是代码。它应该随着其所基于的模型的变化而更新。

我已经在代码中构造了这些控件的每个实例,并设置了与某个对象_interestingSystem的绑定。

var newViewInstance = new BroadcastCell
{
    HeartbeatStatus = Heartbeat.Status.NotRx,
    BindingContext = _interestingSystem,
};
broadcastCell.SetBinding(BroadcastCell.HeartbeatProperty, "HeartbeatStatus");
StatkStack.Children.Add(broadcastCell);

这些绑定有效,我可以看到响应模型的代码背后的变化就很好了。

现在,我想将我的视图绑定到后面的代码中,进行一些修改和调整。
XAML

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="56" />
        <RowDefinition Height="20" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="65" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Label Text="{Binding Title, FallbackValue=TestTitle, Mode=OneWay}" Grid.Column="1"  />
    <Label Text="{Binding SecondaryLine, FallbackValue=Test2nd}" Grid.Column="1" Grid.Row="1"  />
</Grid>

隐藏代码

public Heartbeat.Status CurrentStatus;

static void OnHeartbeatStatusChanged(BindableObject sender, object oldValue, object newValue)
{
    var thisInstance = (BroadcastCell)sender;
    var newStatus = (Heartbeat.Status)newValue;
    thisInstance.CurrentStatus= newStatus;
}

private void UpdateAndModifyResult()
{
    SecondaryLine = $"{DateTime.Now} {CurrentStatus} @ {AnotherStatus}";
}

public String SecondaryLine
{
    get { return _secondaryLine; }
    set
    {
        _secondaryLine = value;
        OnPropertyChanged();
    }
}

我可以在尝试时将Xaml的绑定设置为后面的代码,并将后面的代码设置为另一个对象吗?
还是我需要将xaml属性名称硬编码到代码背后,以“手动”更新它们?

1 个答案:

答案 0 :(得分:0)

在XAML中,您可以使用Binding绑定模式将BroadcastCell的源设置为根FindAncestor

<Label Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:BroadcastCell}}, Path=SecondaryLine}" Grid.Column="1" Grid.Row="1"/>

在加载XAML时,绑定引擎将在可视树中查找第一个BroadcastCell对象,并绑定到其SecondaryLine属性。

或者,您可以直接将视图绑定到模型,而无需通过以下操作在代码背后手动设置任何类型的绑定:

<Label Text="{Binding Heartbeat.Status}" Grid.Column="1" Grid.Row="1"/>

假设您将视图的DataContext设置为正确的源对象。您的隐藏代码将变为:

broadcastCell.DataContext = _interestingSystem;

这比在后面的代码中定义绑定更合适。