代码之家  ›  专栏  ›  技术社区  ›  123Developer

如何将itemTemplate复选框的command属性绑定到viewModel对象的属性?

  •  1
  • 123Developer  · 技术社区  · 15 年前

    让我用伪代码来问这个问题:

    
    
    <Window>
        <ListView ItemsSource="{Binding PersonCollection}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Name}" />
                        <TextBlock Text="{Binding Path=Age}" />
                        <TextBlock Text="/" />
                        <CheckBox Command="{Binding PersonSelectedCommand}" />  <!-- Where "PersonSelectedCommand" is a public command property available in ViewModel object (lets say "Contacts"  in this context)-->
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Window>
    

    在哪里?
    “contacts”将ViewModel对象设置为窗口的DataContext。

    “联系人”具有“个人集合”、公共图标和个人选择的命令属性。 “个人收藏”是清单

    “人”具有姓名、年龄属性

    当前这不起作用,因为复选框正在尝试查找和绑定对象“Person”的ICommand“PersonalSelectedCommand”属性,但该属性不存在!

    如何将复选框绑定到ICommand“personselectedcommand”property of object“contact”

    谢谢和问候
    123去耦器

    3 回复  |  直到 15 年前
        1
  •  6
  •   Ray Burns    15 年前

    我喜欢seesharp的答案,但要直接回答您的问题,您只需将复选框的命令绑定更改为:

    Command="{Binding DataContext.PersonSelectedCommand,
                      RelativeSource={RelativeSource FindAncestor,ListView,1}}"
    

    这比Seesharp的答案更可取,只有当你需要更多的控制,而不是简单地约束Isselected财产会给你。否则,请选择具有约束力的。

        2
  •  1
  •   SeeSharp    15 年前

    你能改变视图模型吗? 我想如果你把布尔财产加在人身上会更好。并将其绑定到复选框:

    <CheckBox IsChecked="{Binding IsSelected}"/>
    

    不需要命令,您可以在属性isselected的setter中添加一些功能。

        3
  •  0
  •   Community Mohan Dere    9 年前

    这个 PersonSelectedCommand 必须在人员范围内。因此,当绑定到人员列表时,您将拥有一个命令列表。因此,无论何时选择一个人,您都将有相应的命令要执行。

    否则,您可以在绑定中使用relativesource查找祖先,并以这种方式设置personalselectedcommand。检查此答案: Is there a simple way to specify a WPF databinding where the path is one "level" up?