Xamarin表单按钮命令绑定在ListView中

时间:2016-12-01 14:41:54

标签: c# xaml listview xamarin.forms

我有以下问题,在我看来我有一个Listview。在这个列表视图中,我想有两个按钮。一个用于编辑项目,一个用于删除它。

以下是我在XAML中的列表视图

<ListView Grid.Row="1" x:Name="ArbeitsEinträgeList" ItemsSource="{Binding EintragList}" SelectedItem="{Binding SelectedItem}">
      <ListView.ItemTemplate>
        <DataTemplate>
          <ViewCell>
            <ViewCell.View>
              <Grid>
                <Grid.ColumnDefinitions>
                  <ColumnDefinition/>
                  <ColumnDefinition/>
                  <ColumnDefinition/>
                  <ColumnDefinition Width="Auto"/>
                  <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <Label Text="{Binding Titel}" TextColor="{Binding Fehlerhaft, Converter={StaticResource EintragartConverter}}"></Label>
                <Label Grid.Column="1" Text="{Binding Beginn}" TextColor="{Binding BeginnManuell, Converter={StaticResource EintragartConverter}}"></Label>
                <Label Grid.Column="2" Text="{Binding Ende}" TextColor="{Binding EndeManuell, Converter={StaticResource EintragartConverter}}"></Label>
                <Button Grid.Column="3" Command="{Binding EditEintragCommand}" Text="&#xf040;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button>
                <Button Grid.Column="4" Command="{Binding DeleteEintragCommand}" Text="&#xF00D;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button>
              </Grid>
            </ViewCell.View>
          </ViewCell>
        </DataTemplate>
      </ListView.ItemTemplate>
    </ListView>

在我的ViewModel中是我需要的一切,我已经使用不在列表视图中的按钮测试了命令,它完美无缺。

如果我将鼠标悬停在绑定上,则会出现“无法解析符号'...'”消息

Cannot resolve symbol

4 个答案:

答案 0 :(得分:35)

Jan,

由于您使用了列表视图并且您的命令位于DataTemplate中,因此绑定将附加到ItemSource中每个单独模型的绑定上下文。

解决这个问题的方法是做以下事情:

<ListView Grid.Row="1" x:Name="ArbeitsEinträgeList" ItemsSource="{Binding EintragList}" SelectedItem="{Binding SelectedItem}">
      <ListView.ItemTemplate>
        <DataTemplate>
          <ViewCell>
            <ViewCell.View>
              <Grid x:Name="Item">
                <Grid.ColumnDefinitions>
                  <ColumnDefinition/>
                  <ColumnDefinition/>
                  <ColumnDefinition/>
                  <ColumnDefinition Width="Auto"/>
                  <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <Label Text="{Binding Titel}" TextColor="{Binding Fehlerhaft, Converter={StaticResource EintragartConverter}}"></Label>
                <Label Grid.Column="1" Text="{Binding Beginn}" TextColor="{Binding BeginnManuell, Converter={StaticResource EintragartConverter}}"></Label>
                <Label Grid.Column="2" Text="{Binding Ende}" TextColor="{Binding EndeManuell, Converter={StaticResource EintragartConverter}}"></Label>
                <Button Grid.Column="3" BindingContext="{Binding Source={x:Reference ArbeitsEinträgeList}, Path=BindingContext}"   Command="{Binding EditEintragCommand}"   CommandParameter="{Binding Source={x:Reference Item}, Path=BindingContext}" Text="&#xf040;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button>
                <Button Grid.Column="4" BindingContext="{Binding Source={x:Reference ArbeitsEinträgeList}, Path=BindingContext}" Command="{Binding DeleteEintragCommand}"  CommandParameter="{Binding Source={x:Reference Item}, Path=BindingContext}" Text="&#xF00D;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button>
              </Grid>
            </ViewCell.View>
          </ViewCell>
        </DataTemplate>
      </ListView.ItemTemplate>
    </ListView>

所以你设置绑定源来引用列表视图的绑定上下文(即你的视图模型或“ArbeitsEinträgeList”。你也可以将命令参数设置为每个单独项目的绑定上下文。你可以看到我网格上有x:Name =“Item”,CommandParameter =“{Binding Source = {x:Reference Item},Path = BindingContext}”。

简单地说,声明这样的命令允许您在视图模型中定义一个通用命令,并在命令参数执行时使用命令参数作为单个项目的绑定上下文。

 public ICommand DeleteEintragCommand
        {
            get
            {
                return new Command((e) =>
                    {
                        var item = (e as MyModelObject);
                        // delete logic on item
                    });
            }
        }

答案 1 :(得分:11)

那是因为你绑定了EintragList - 属性中的一个项目(这就是你绑定到BeginnEnde等文本属性的原因。命令绑定尝试从列表中的单个项目中获取命令,而不是从您的视图模型中获取。

选项1:您在项目类中设置命令并处理那里的点击。

选项2:告诉您绑定源应该是您的页面(而不是单个项目):

Command="{Binding BindingContext.EditEintragCommand, Source={x:Reference Name=MyPageName}}"

请确保您的网页名称根元素设置为x:Name="MyPageName"

要知道,哪个项触发了命令,您可以设置CommandParameter属性,然后将该属性作为对象发送给命令:

CommandParameter="{Binding .}"

Additionaly:当您使用外部模板显示列表中的项目时,您可以尝试something I described in another answer(原理相同)。

答案 2 :(得分:4)

如果你想绑定Button click,你也可以尝试在Button属性中使用Clicked事件这是我的代码,它对我有用

  <ListView x:Name="lst1" RowHeight="80">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Orientation="Vertical" Padding="8,0,8,0">
                        <Label Text="{Binding Fname}" TextColor="#000" FontSize="14" LineBreakMode="TailTruncation" />
                        <Label Text="{Binding Mobile}" TextColor="#000" LineBreakMode="TailTruncation" />
                        <Button Text="Remove" Clicked="Delete" CommandParameter="{Binding ID}" />
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

和代码方面你可以简单地使用像

这样的参数实现delete方法
   public void Delete(Object Sender, EventArgs args)
    {
        Button button = (Button)Sender;
        string ID = button.CommandParameter.ToString();
        // Do your Stuff.....
    }

答案 3 :(得分:0)

这是另一件事,会让您大吃一惊。如果您不小心将ViewModel中的ICommand定义为私有属性,则永远不会发生与命令的绑定。

相关问题