我正在尝试使用棱镜浏览器扩展方法通过ListView中的按钮在XAML中绑定字符串路径。
显然,BindingContext与ListView中的不相同
这是我要实现的示例代码。
<ListView
x:Name="MainMenu"
CachingStrategy="RetainElement"
HasUnevenRows="True"
ItemsSource="{Binding MenuItems}"
Margin="20,0,0,0"
SeparatorVisibility="Default">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<buttons:SfButton
Style="{StaticResource BaseButtonStyle}"
HeightRequest="70"
TextColor="{StaticResource MenuTextColor}"
Text="{Binding Title}"
HorizontalTextAlignment="Start"
VerticalOptions="CenterAndExpand"
HorizontalOptions="FillAndExpand"
ImageSource="{Binding MenuItemType, Converter={StaticResource MenuItemTypeConverter}}"
ShowIcon="True"
Command="{prism:NavigateTo Name={Binding Item.View}}"
/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
有什么想法在这种情况下如何设置绑定?
致谢。
答案 0 :(得分:0)
在任何种类的ListView,CollectionView等中,您要绑定ItemsSource,然后使用某种DataTemplate来显示该集合中的单个项目,该DataTemplate中的Binding Context是集合中的单个项目,而不是ViewModel提供您的Page和ListView的绑定上下文。
从技术上讲,您需要了解几个部分。假设您的模型如下所示:
public class FooModel
{
public string Text { get; set; }
public string NavigationPath { get; set; }
}
我们假设您有一个FooModel集合,例如:
public ObservableCollection<FooModel> FooItems { get; }
在XAML中,您可能会有类似的内容:
<ListView ItemsSource="{Binding FooItems}">
但是,当您转到FooItem的引用属性时,您将只引用它们,如:
<ListView.DataTemplate>
<DataTemplate>
<ViewCell>
<Button Text="{Binding Text}"
Command="{prism:NavigateTo Name={Binding NavigationPath}" />
</ViewCell>
</DataTemplate>
</ListView.DataTemplate>
现在假设问题不在于您只是错误地添加了Item
,让我们看一下其他可能的问题/解决方案。首先,让我们看一下页面的开始。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="http://prismlibrary.com"
x:Name="page"
x:Class="HelloWorld.Views.ViewA">
这里要注意的一件大事是我添加了x:Name
属性,以便以后可以引用页面本身。通常,在类似ListView的上下文中,如果我需要访问说ViewModel中的FooCommand
属性,我可能会更改以下内容的XAML标记:
<Button Command="{Binding FooCommand}" />
要改为这样查看Page的BindingContext:
<Button Command="{Binding BindingContext.FooCommand, Source={x:Reference page}}" />
虽然这总体上可以在ListView中为您提供帮助,但在使用Prism的导航扩展方面仍然不一定可以帮助您。为此,您可能需要像下面这样传递SourcePage:
<Button Command="{prism:NavigateTo 'Foo', SourcePage={x:Reference page}}" />
如果由于某种原因该方法不起作用,则可能是未在Navigation Extension本身上正确设置BindingContext。要解决此问题,您需要更新命令,如下所示:
<Button x:Name="cellButton"
Command="{prism:NavigateTo Name={Binding View},
BindingContext={x:Reference cellButton}}" />
请注意,如果您需要引用SourcePage或添加BindingContext来解决问题,请提供一个可重现该问题的示例,并在GitHub上打开issue。