UWP社区工具包的MasterDetailsView中的项目未正确更新

UWP社区工具包的MasterDetailsView中的项目未正确更新,uwp,uwp-xaml,windows-community-toolkit,Uwp,Uwp Xaml,Windows Community Toolkit,我试图使用UWP社区工具包MasterDetailsView来提供编辑界面。但是,当我进行更改时,我似乎无法让它的listview中的各个项目更新它们的属性 下面是我用来连接控件的XAML的一部分: <controls:MasterDetailsView x:Name="masterDetailsView" Foreground="Black" ItemsSource="{x:Bind libraryVM.Re

我试图使用UWP社区工具包MasterDetailsView来提供编辑界面。但是,当我进行更改时,我似乎无法让它的listview中的各个项目更新它们的属性

下面是我用来连接控件的XAML的一部分:

        <controls:MasterDetailsView x:Name="masterDetailsView" Foreground="Black"
                                ItemsSource="{x:Bind libraryVM.Recipes, Mode=TwoWay}"
                                SelectedItem="{x:Bind libraryVM.SelectedRecipe, Mode=TwoWay}"
                                NoSelectionContent="Select an item to view">
        <controls:MasterDetailsView.ItemTemplate>
            <DataTemplate x:DataType="recipes:RecipeVM">
                <StackPanel Margin="0,8">
                    <TextBlock Style="{ThemeResource SubtitleTextBlockStyle}"
                               Text="{x:Bind Name}" />
                </StackPanel>
            </DataTemplate>
        </controls:MasterDetailsView.ItemTemplate>
...
然而,当我更新任何RecipeVM项时,我似乎无法在MasterDetailsView的ListView中获取它的相应项进行更新。我相信我已经在适当的地方实现了INotifyPropertyChanged,但我显然遗漏了一些东西

更新
我已经验证了绑定在其他任何地方都有效。如果我在进行更改后单步执行代码,RecipeVM和底层配方会相应地更新

将您的Textblock绑定更改为Text={binding Name}

感谢Chirag Shah,他为我指出了大致正确的方向

将{x:Bind Name}更改为{Binding Name}有效,但这并不是因为x:Bind有什么问题,而是因为我对它的理解有问题

我缺少的是x:Bind默认为一种更保守的绑定模式

关于它的模式属性,他说:

将绑定模式指定为以下字符串之一:OneTime、OneWay或TwoWay。默认值为一次性。请注意,这与{Binding}的默认值不同,在大多数情况下是单向的

更新我的XAML以显式声明模式解决了这个问题

<TextBlock Style="{ThemeResource SubtitleTextBlockStyle}"
    Text="{x:Bind Name, Mode=OneWay}" />

另一个很好的参考是这个问题的答案:

将您的OnPropertyChanged更改为OnPropertyChanged。关于PropertyChangedDescription的示例@运行时的AVKNaidu[CallerMemberName]提供适当的名称。我已经在调试期间验证了这一点。
public class RecipeVM : INotifyPropertyChanged
{
    Recipe _recipe;
    Recipe _backup;
    public event PropertyChangedEventHandler PropertyChanged;

    public Recipe Recipe
    {
        get
        {
            return _recipe;
        }
    }

    public RecipeVM(Recipe recipe = null)
    {
        _recipe = recipe;

        if(_recipe == null)
        {
            _recipe = new Recipe();
            _recipe.Name = "New Recipe";
        }

        this.IsEditing = false;
    }

    public Guid Id
    {
        get
        {
            return _recipe.Id;
        }

        set
        {
            _recipe.Id = value;
            OnPropertyChanged();
        }
    }

    bool _IsEditing;


    public bool IsEditing
    {
        get
        {
            return _IsEditing;
        }

        set
        {
            _IsEditing = value;
            OnPropertyChanged();
        }
    }

    public string Name
    {
        get
        {
            return _recipe.Name;
        }

        set
        {
            _recipe.Name = value;
            OnPropertyChanged();
        }
    }

    public string Description
    {
        get
        {
            return _recipe.Description;
        }

        set
        {
            _recipe.Description = value;
            OnPropertyChanged();
        }
    }

    public void MakeBackup()
    {
        _backup = new Recipe()
        {
            Id = _recipe.Id,
            Name = _recipe.Name,
            Description = _recipe.Description
        };
    }

    public void RestoreBackup()
    {
        Name = _backup.Name;
        Description = _backup.Description;
    }

    void OnPropertyChanged([CallerMemberName]string propertyName = "")
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
<TextBlock Style="{ThemeResource SubtitleTextBlockStyle}"
    Text="{x:Bind Name, Mode=OneWay}" />