与棱镜导航绑定

时间:2019-11-20 13:19:21

标签: xaml xamarin binding navigation prism

我正在尝试使用棱镜浏览器扩展方法通过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>

有什么想法在这种情况下如何设置绑定?

致谢。

1 个答案:

答案 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