相关来源绑定Xamarin

Jso*_*ork 3 c# data-binding xaml xamarin xamarin.forms

我的问题在于viewcell,由于它是IssueModel类而找不到OnDelete命令,我试图改变Listview的绑定上下文,但除了上面的绑定之外,它不会改变任何东西.

有没有办法改变视单元的绑定上下文,所以我不必将命令放入IssueModel?

freshMvvm:FreshBaseContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:converters="clr-namespace:ASFT.Converters;assembly=ASFT"
             xmlns:freshMvvm="clr-namespace:FreshMvvm;assembly=FreshMvvm"
             xmlns:helperMethods="clr-namespace:ASFT.HelperMethods;assembly=ASFT"
             x:Class="ASFT.Pages.IssueListPage">
    <ContentPage.Resources>
        <ResourceDictionary>
            <converters:SelectedItemEventArgsToSelectedItemConverter x:Key="SelectedItemConverter" />
            <converters:DateTextConverter x:Key="DateToTextConverter" />
        </ResourceDictionary>
    </ContentPage.Resources>
<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 >
                    <ViewCell.ContextActions>
                        <MenuItem  Command="{Binding OnDelete}"  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>

</freshMvvm:FreshBaseContentPage>
Run Code Online (Sandbox Code Playgroud)

编辑:

我尝试过其中一个答案但是没有用.这只是一个错误消息:期望的类型是对象,但类型是IssueListPageModel

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



 <MenuItem Command="{Binding Path=BindingContext.OnDelete, Source={pageModels:IssueListPageModel}}" Text="Delete" IsDestructive="True" />
Run Code Online (Sandbox Code Playgroud)

Ger*_*uis 9

添加一个x:Name属性freshMvvm:FreshBaseContentPage,如:x:Name="MyAwesomePage".

现在改变你的ViewCell绑定:

<MenuItem Command="{Binding Path=BindingContext.OnDelete, Source={x:Reference Name=MyAwesomePage}}" Text="Delete" IsDestructive="True" />
Run Code Online (Sandbox Code Playgroud)

现在,使用其名称将绑定源设置为页面.并且路径设置为属性BindingContext.OnDelete.因此,在此页面的后备视图模型中应该有一个OnDelete属性.

澄清你在评论中提到的单独组件.

Path=省略了常规的结合.未明确提及时,{Binding MyProperty}表示与"{Binding Path = MyProperty}"相同.Path表示需要绑定的值的路径BindingContext,因此实际上是绑定到的属性.

Source用于指定什么是的来源Path.这本身就是另一种约束力.在我们的情况下,我们刚刚给出页面的名称已知的引用.这样,ViewCell知道的绑定开始于Source然后搜索Path以检索其值.我希望这有点清楚.

如果您愿意,可以在此处引用任何内容,只要您可以在此处访问该类的实例.但是,我建议将其保留BindingContext为有效的视图模型(注意:BindingContext是包含视图模型的页面的实际属性).否则,您将很快失去概述.