Привязка представления Xaml UserControl к его коду позади, но к коду привязано к другому объекту - PullRequest
1 голос
/ 23 октября 2019

У меня есть UserControl, определенный Xaml и код позади. Он должен обновляться по мере изменения модели, на которой он основан.

Я создал каждый экземпляр этих элементов управления в коде и установил привязки к некоторому объекту _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 голосов
/ 23 октября 2019

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

Это более уместно, чем определение привязки в коде позади.

...