基本上,我有一个带有DataTemplate选择器的ListView,它基于ListView项使用特定的DataTemplate。
现在,在DataTemplate中,我有一个带有命令的按钮,应该绑定到父视图(或ListView)本身的ViewModel上。
注意,我只想绑定按钮的Command属性,因为文本和其他属性需要绑定到按钮的当前绑定上下文。
DataTemplate的BindingContext是ListView项BindingContext(本例中为消息模型),但我希望能够将数据模板中的一个特定按钮绑定到父ListView的viewmodel。
我该怎么做呢?
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MobileMobile.Views.MobileMessageListView"
Title="Message List"
NavigationPage.BarBackgroundColor="#FF9100"
NavigationPage.BarTextColor="White"
xmlns:ViewSwitchers="clr-namespace:MobileMobile.ViewSwitchers;assembly=MobileMobile"
xmlns:ViewCells="clr-namespace:MobileMobile.ViewCells;assembly=MobileMobile"
xmlns:Extensions="clr-namespace:MobileMobile.Extensions;assembly=MobileMobile"
>
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key="botMessageDataTemplate">
<ViewCell>
<Button Text="Hello!" Command="{Binding TestCommand, Source=???}" CommandParameter="Hello"/>
</ViewCell>
</DataTemplate>
<ViewSwitchers:MobileMessageTemplateSwitcher x:Key="MobileMessageTemplateSwitcher" BotMessageDataTemplate="{StaticResource botMessageDataTemplate}" />
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Row="0" Orientation="Vertical" x:Name="MainViewStack">
<ListView
CachingStrategy="RecycleElement"
BackgroundColor="Transparent"
ItemTemplate="{StaticResource MobileMessageTemplateSwitcher}"
IsPullToRefreshEnabled="true"
RefreshCommand="{Binding RefreshCommand}"
ItemsSource="{Binding Messages}"
HasUnevenRows="true"
IsRefreshing="{Binding IsLoading, Mode=OneWay}"
SeparatorVisibility="None">
<ListView.Footer/>
</ListView>
</StackLayout>
<StackLayout Grid.Row="1" Orientation="Horizontal" HeightRequest="50">
<Entry Text="{Binding CurrentMessageText}" Placeholder="{Binding MessageTextPlaceHolder}" HorizontalOptions="FillAndExpand"/>
<Button Text="SEND" Command="{Binding SendMessageCommand}"/>
</StackLayout>
</Grid>
</ContentPage.Content>
</ContentPage>
不要在内容字典中将datatemplate声明为静态资源,而是将datatemplate放在列表本身的itemtemplate中。
我不是100%确定引擎盖下发生了什么,但当声明为静态资源时,datatemplate似乎与页面的绑定上下文没有关联。这意味着,当您离开并返回页面或更改listview的内容时,您可能会在呈现项目更新时遇到问题。
这将使您能够将按钮命令绑定到父级,但也可以在您离开并重新访问页面时停止任何问题
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MobileMobile.Views.MobileMessageListView"
Title="Message List"
NavigationPage.BarBackgroundColor="#FF9100"
NavigationPage.BarTextColor="White"
xmlns:ViewSwitchers="clr-namespace:MobileMobile.ViewSwitchers;assembly=MobileMobile"
xmlns:ViewCells="clr-namespace:MobileMobile.ViewCells;assembly=MobileMobile"
xmlns:Extensions="clr-namespace:MobileMobile.Extensions;assembly=MobileMobile"
x:Name="DeclareYourCodeBehindHereOrDeclareAViewModel"
>
<ContentPage.Resources>
<ResourceDictionary>
<ViewSwitchers:MobileMessageTemplateSwitcher x:Key="MobileMessageTemplateSwitcher" BotMessageDataTemplate="{StaticResource botMessageDataTemplate}" />
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Row="0" Orientation="Vertical" x:Name="MainViewStack">
<ListView
CachingStrategy="RecycleElement"
BackgroundColor="Transparent"
IsPullToRefreshEnabled="true"
RefreshCommand="{Binding RefreshCommand}"
ItemsSource="{Binding Messages}"
HasUnevenRows="true"
IsRefreshing="{Binding IsLoading, Mode=OneWay}"
SeparatorVisibility="None">
<ListView.ItemTemplate>
<DataTemplate x:Key="botMessageDataTemplate">
<ViewCell>
<Button Text="Hello!" Command="{Binding Source={x:Reference DeclareYourCodeBehindHereOrDeclareAViewModel}, Path=BindingContext.CommandName}" CommandParameter="Hello"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Footer/>
</ListView>
</StackLayout>
<StackLayout Grid.Row="1" Orientation="Horizontal" HeightRequest="50">
<Entry Text="{Binding CurrentMessageText}" Placeholder="{Binding MessageTextPlaceHolder}" HorizontalOptions="FillAndExpand"/>
<Button Text="SEND" Command="{Binding SendMessageCommand}"/>
</StackLayout>
</Grid>
</ContentPage.Content>
试试这个:
<Button
Text="Hello!"
Command="{Binding Path=BindingContext. TestCommand, Source={x:Reference Name=MessageListPage}}"
CommandParameter="Hello" />
您必须给页面一个x: Name
属性,其值为MessageListPage
,所以它会稍微扰乱您的纯MVVM,但是由于Xamarin XAML不支持相对绑定(据我所知...)这是要走的路。
现在,我正在尝试让ListView具有一些可绑定的CustomCells。我将XAML中的单元格定义为DataTemplate下的ViewCell和ListView.ItemTemplate下的ViewCell。 为了简单起见,让我们假设我在单元格中表示了两个字符串。ViewCell看起来如下所示: 编辑1: 我尝试编写一个模仿一些示例的文件,但这还不够。没有一段代码解释该文件是XAML中表示Vi
我发现需要绑定到的,设置如下: 在设计时。但是,我需要从具有不同数据上下文的子控件绑定到它: 由于 是为 设置的,因此我的 的数据设置为收款人集合中的各个对象。我的视图有一个属性,我需要从转换器中的引用该属性来确定项目的可见性。 我可以根据对象的属性设置可见性,如下所示: 但是我真正需要绑定到的是的的属性。有没有办法从子控件中获取该上下文?我使用的是WinRT,所以我没有绑定源的好处。 编辑 正如
我有一个基于令牌的用户身份验证的Jersey REST应用程序。当请求传入时,会创建一个自定义的对象,并将其作为一个属性添加到 的用法,我想知道是否可以使用injection将这个< code>RestContext注入到我的资源和其他过滤器中(例如,我有一个过滤器,它从< code>RestContext中创建一个< code>SecurityContext),但是我找不到答案。一般来说,我如何
如何将 itemcount 绑定到我的数据上下文以计算每个组中的所有项目,然后将其显示在标题中 我的项目绑定到的 视图模型 数据上下文 它之前用这个工作过 System. Windows. Data错误:4:找不到与引用绑定的源 'RelativeSource FindAncestor, AncestorType='System. Windows. Control. UserControl', A
我遇到了一个很奇怪的问题。我尝试将属性绑定到DataContext,但它不起作用。这是我正在做的事情(在橱窗里)。资源部分): 在代码的其他地方,我像这样设置数据上下文: 我没有收到任何错误,但绑定没有发生。所以我添加了一个调试转换器,看看我是否可以弄清楚发生了什么: 我在转换器中设置了一个断点,传递的值为 null。确定事情不正常,我在设置 DataContext 的行上设置了一个断点。它首先被
我正试图为Facebook通知创建绑定。aar库。 然而,我得到了编译错误: 严重性代码说明项目文件行抑制状态错误CS0103名称'CreateAsset'在当前上下文中不存在FBNotificationsC:\users\Jakub\Documents\Visual studio 2015\Projects\FBNotifications\FBNotifications\OBJ\Release\