【问题标题】:How to bind to a viewmodel instead of a page如何绑定到视图模型而不是页面
【发布时间】:2018-04-05 14:17:10
【问题描述】:

我的问题出在 viewcell 上,由于它属于 IssueModel 类,因此找不到 OnDelete 命令,我尝试更改 Listview 的绑定上下文,但除了上述绑定之外没有任何改变.

有什么方法可以改变 viewcell 的绑定上下文,所以我不必将命令放入 IssueModel 中?我尝试了以下解决方案,但出现错误

“无效的标记扩展:预期类型为对象,实际类型为 Issuepagemodel”

      xmlns:pageModels="clr-namespace:ASFT.PageModels;assembly=ASFT"

 <ListView ItemsSource="{Binding Issues}" SeparatorColor="#444444" RowHeight="90" IsPullToRefreshEnabled="True" IsRefreshing="{Binding IsBusy}" RefreshCommand="{Binding PullRefreshCommand}" >
        <ListView.Behaviors>
        <helperMethods:EventToCommandBehavior EventName="ItemSelected" 
                                          Command="{Binding OnSelectedIssueCommand}" 
                                          Converter="{StaticResource SelectedItemConverter}" />
        </ListView.Behaviors>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell x:Name="Stalin">
                    <ViewCell.ContextActions>
                        <MenuItem x:Name="Hitler" Command="{Binding Path=BindingContext.OnDelete, Source={pageModels:IssueListPageModel}}" Text="Delete" IsDestructive="True" />
                    </ViewCell.ContextActions>

                    <ViewCell.View>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"></RowDefinition>
                                <RowDefinition Height="Auto"></RowDefinition>
                                <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="70"></ColumnDefinition>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                                <ColumnDefinition Width="50"></ColumnDefinition>
                            </Grid.ColumnDefinitions>

                            <Image Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" Source="{Binding SeverityImagePath}" HorizontalOptions="Center" VerticalOptions="Center" HeightRequest="70"/>
                            <Image Grid.Row="0" Grid.RowSpan="3" Grid.Column="2" Source="{Binding StatusImagePath}" HorizontalOptions="Center" VerticalOptions="Center" HeightRequest="60"/>

                            <Label Grid.Row="0" Grid.Column="1" Text="{Binding Title}" LineBreakMode="TailTruncation" YAlign="Center" VerticalOptions="Start" Font="Bold, Medium"/>
                            <Label Grid.Row="1" Grid.Column="1" Text="{Binding Created, Converter={StaticResource DateToTextConverter}}" YAlign="Center" VerticalOptions="Start" Font="Medium"/>
                            <Label Grid.Row="2" Grid.Column="1" Text="{Binding Description}" LineBreakMode="WordWrap" YAlign="Start" VerticalOptions="Start" Font="Small"/>
                        </Grid>

                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

【问题讨论】:

  • 您是否尝试在绑定中使用 relativeSource 或 elementName?
  • 不知道那些是什么,所以也许吧。也许不是

标签: c# xaml xamarin xamarin.forms


【解决方案1】:

如果我了解您的问题,应该很容易。

将您页面的BindingContext 设置为您的ViewModel,其中包含下一个名称为“MyRootLevelCommand”的Command

命名您的根 UI 元素:

<Grid x:Name="root"> .. </Grid>

假设在这个Grid 中有一个ListView,并且你想将页面视图模型中的Command 绑定到ListView 中的每个项目:

 <ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <Button Command="{Binding Source={x:Reference root}, Path=BindingContext.MyRootLevelCommand}" />
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>

【讨论】:

  • 那行不通。因为我不想访问根目录。我想访问页面模型。不是代码隐藏页面。
  • 上面的代码是访问页面的BindingContext(ViewModel)的例子。根本不涉及代码隐藏。
  • 哇哦。完美运行。我不知道它是如何工作的,我认为这应该是代码隐藏。由于进行普通绑定并仅使用命令的名称,它在正常情况下会进入页面模型。 (虽然不是这个,因为这次视单元转到了 IssueModel)但现在它可以工作了。你能解释一下如何将它绑定到代码隐藏页面吗?并不是说我需要也永远不需要,因为在使用 MVVM 时这很愚蠢,只是我想了解您的解决方案。顺便谢谢你。
  • 官方文档很好地涵盖了这个主题:docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/…很高兴为您提供帮助!
  • 关于“将其绑定到代码隐藏页面”,通常在这种情况下使用事件,因为不支持开箱即用的多个绑定上下文。
猜你喜欢
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多