Привязка двух свойств элемента XAML к одному и тому же свойству ViewModel не работает - PullRequest
1 голос
/ 02 марта 2020

Описание проблемы

Я использую Основные сведения Просмотр . Он имеет два свойства Details Header и SelectedItem. Я связываю оба свойства Selected в ViewModel. Цель состоит в том, чтобы изменить заголовок DetailsHeader в зависимости от выбранного элемента. Проблема в том, что обновляется только SelectedItem. Текст не отображается в DetailsHeader.

DetailsHeader="{x:Bind ViewModel.Selected, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}"

Если ссылка одна на другую, он работает правильно - оба обновляются.

DetailsHeader="{x:Bind masterDetailsView.SelectedItem, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}"

Я не нахожу в документирование ограничения на тот факт, что свойство из контекста может быть связано только с одним свойством элемента XAML. В чем может быть проблема?

Код

ViewModelBase из MVVM Light используется для уведомления об изменениях. Его метод Set() обновляет свойство и вызывает событие изменения.

private SampleVendorModel _selected;
public SampleVendorModel Selected 
{ 
    get => _selected;
    set => Set(ref _selected, value);
}

Модель

public class SampleVendorModel
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public string MiddleName { get; set; }

    public string FullName => $"{Surname} {Name} {MiddleName}";
    public string NameWithoutSurname => $"{Name} {MiddleName}";
}

MasterDetailsView

<controls:MasterDetailsView Name="masterDetailsView"
                            MasterHeader="{x:Bind ViewModel.Title}"
                            MasterHeaderTemplate="{StaticResource MasterHeaderTemplate}"  
                            DetailsHeader="{x:Bind masterDetailsView.SelectedItem, Mode=OneWay}"
                            DetailsHeaderTemplate="{StaticResource DetailsHeaderTemplate}"                                   
                            ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}"
                            SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}"
                            ItemTemplate="{StaticResource ItemTemplate}"
                            DetailsTemplate="{StaticResource DetailsTemplate}"                                    
                            BorderBrush="Transparent"
                            BackButtonBehavior="Manual">
</controls:MasterDetailsView>

Страница ресурса

<Page.Resources>
        <Style x:Key="HeaderStyle" TargetType="TextBlock">
            <Setter Property="FontSize" Value="30" />
            <Setter Property="FontWeight" Value="Light" />
            <Setter Property="Margin" Value="0, 10, 0, 10" />
            <Setter Property="TextTrimming" Value="CharacterEllipsis"/>
        </Style>

        <DataTemplate x:Key="MasterHeaderTemplate">
            <TextBlock Text="{Binding}" Style="{StaticResource HeaderStyle}"/>
        </DataTemplate>
        <DataTemplate x:Key="DetailsHeaderTemplate" x:DataType="viewmodels:SampleVendorModel">
            <TextBlock Text="{x:Bind FullName}" Style="{StaticResource HeaderStyle}" />
        </DataTemplate>
        <DataTemplate x:Key="ItemTemplate" x:DataType="viewmodels:SampleVendorModel">
            <Grid Margin="0, 10, 0, 10" RowSpacing="2">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Text="{x:Bind Surname}" FontWeight="Bold" FontSize="16" TextTrimming="CharacterEllipsis" />
                <TextBlock Grid.Row="1" Text="{x:Bind NameWithoutSurname}" TextTrimming="CharacterEllipsis" />
            </Grid>
        </DataTemplate>
        <DataTemplate x:Key="DetailsTemplate"
                      x:DataType="viewmodels:SampleVendorModel">
            <StackPanel Margin="10">
                <TextBlock Text="{x:Bind Surname}" />
                <TextBlock Text="{x:Bind Name}" />
                <TextBlock Text="{x:Bind MiddleName}" />
            </StackPanel>
        </DataTemplate>
</Page.Resources>

1 Ответ

0 голосов
/ 02 марта 2020

Проблема в том, что обновляется только SelectedItem

Я ошибся. MasterDetailsView.SelectedItem обновляется с помощью свойства ViewModel.Selected в коде. В случае навигации по пользовательскому интерфейсу ViewModel.Selected не изменяется. Потому что режим привязки OneWay. Как следствие, MasterDetailsView.DetailsHeader не получает уведомления о выбранном изменении.

Для решения проблемы необходимо установить режим как TwoWay для MasterDetailsView.SelectedItem.

DetailsHeader="{x:Bind ViewModel.Selected, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.Selected, Mode=TwoWay}"
...