我有一个由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属性名称硬编码到代码背后,以“手动”更新它们?
答案 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;
这比在后面的代码中定义绑定更合适。