UWP社区工具包的MasterDetailsView中的项目未正确更新
我试图使用UWP社区工具包MasterDetailsView来提供编辑界面。但是,当我进行更改时,我似乎无法让它的listview中的各个项目更新它们的属性 下面是我用来连接控件的XAML的一部分: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
<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}" />