将两个XAML元素属性绑定到相同的ViewModel属性不起作用

问题描述 投票:1回答:1

问题描述

我使用Master Details View控件。它具有两个属性Details HeaderSelectedItem。我将两者都绑定到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>
c# xaml data-binding mvvm-light inotifypropertychanged
1个回答
1
投票

问题是仅更新了SelectedItem

我委屈。 MasterDetailsView.SelectedItem通过代码中的属性ViewModel.Selected更新。在UI导航的情况下,ViewModel.Selected不变。因为绑定模式是OneWay。结果,MasterDetailsView.DetailsHeader不会收到有关所选更改的通知。

为了解决该问题,需要将TwoWay的模式设置为MasterDetailsView.SelectedItem

DetailsHeader="{x:Bind ViewModel.Selected, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.Selected, Mode=TwoWay}"
© www.soinside.com 2019 - 2024. All rights reserved.