【问题标题】:How to bind the Command property of the ItemTemplate CheckBox to ViewModel object's property?如何将 ItemTemplate CheckBox 的 Command 属性绑定到 ViewModel 对象的属性?
【发布时间】:2011-03-04 18:50:55
【问题描述】:

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



<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>

在哪里
“联系”设置为窗口 DataContext 的 ViewModel 对象。

"Contacts" 具有 "PersonCollection" ,公共 ICommand PersonSelectedCommand 属性。 “PersonCollection”是列表

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

目前这不起作用,因为 CheckBox 正在尝试查找并绑定对象“person”的 ICommand“PersonSelectedCommand”属性,该属性不存在!

如何将 CheckBox 绑定到对象“Contact”的 ICommand“PersonSelectedCommand”属性

感谢和问候
123开发者

【问题讨论】:

    标签: wpf binding itemtemplate icommand


    【解决方案1】:

    我喜欢 SeeSharp 的回答,但要直接回答您的问题,您只需将 CheckBox 的 Command 绑定更改为:

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

    仅当您需要更多控制而不是简单地绑定 IsSelected 属性时,这比 SeeSharp 的答案更可取。否则使用绑定 IsSelected。

    【讨论】:

    • 这就是我要找的。我的 CheckBox 已经绑定了 IsSelected 属性(我在问题中没有提到)。正如你所说,我需要更多的控制。谢谢。
    【解决方案2】:

    你能改变视图模型吗? 如果将布尔属性 IsSelected 添加到 Person,我认为会更好。并将其绑定到复选框:

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

    命令不需要,您可以在属性 IsSelected 的设置器中添加一些功能。

    【讨论】:

    • 好答案 (+1)。另请参阅我的答案,其中说明了他如何在不更改 ViewModel 的情况下做到这一点。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      相关资源
      最近更新 更多