c# – 当我使用caliburn micro时,如何将wpf网格上的按钮绑定到MVVM上的方法

c# – 当我使用caliburn micro时,如何将wpf网格上的按钮绑定到MVVM上的方法,第1张

概述我在wpf窗口上有一个Grid,我想添加一个功能,用户可以通过单击删除按钮删除一些项目.该应用程序使用Calibrun Micro将视图绑定到ViewModel. 我的问题? 1-在WPF中使用按钮从网格中删除项目是一个好主意吗? 2-如何将按钮绑定到VM上的方法,并在methd中获取指向应删除的项目的指针? EDIT1 我以这种方式将按钮添加到datagrid: <DataGridTemplat 我在wpf窗口上有一个GrID,我想添加一个功能,用户可以通过单击删除按钮删除一些项目.该应用程序使用Calibrun Micro将视图绑定到viewmodel.

我的问题?

1-在WPF中使用按钮从网格中删除项目是一个好主意吗?

2-如何将按钮绑定到VM上的方法,并在methd中获取指向应删除的项目的指针?

EDIT1

我以这种方式将按钮添加到datagrID:

<DataGrIDTemplateColumn WIDth="100">    <DataGrIDTemplateColumn.CellTemplate>        <DataTemplate>            <button Content="Delete" cal:Message.Attach="DeleteFromList($dataContext)" />         </DataTemplate>     </DataGrIDTemplateColumn.CellTemplate> </DataGrIDTemplateColumn>

和c#代码如下:

public voID DeleteFromList(object tmp)    {    }

但是datagrID上的按钮被禁用,单击它们不会触发DeleteFromList方法(我使用调试器检查).

为什么他们被禁用?如何启用它们?

解决方法 这取决于你的按钮的放置方式 – 是否有一个’删除’按钮或你在网格中每行添加一个按钮(我们是在谈论DataGrID还是仅仅是网格?)

假设您正在讨论DataGrID,您可以轻松地向该按钮添加一个 *** 作消息命令,并将正在删除的项目传递给VM上的消息处理程序

例如在VM中

public class Myviewmodel{    public DataItemCollectionTypename ItemCollection { get; set; }    public voID DeleteItem(DataItemTypename item)    {        ItemCollection.Remove(item);    }}

假设ItemCollection绑定到网格,按钮XAML可能如下所示:

<button cal:Message.Attach="[Click] = [DeleteItem($datacontext)]" />

如果这是一个模板行,您可能还需要设置Action.TargetWithoutContext(它应该绑定到VM),否则CM将无法找到VM来调用 *** 作消息

如果您有一个未包含在网格中的单个按钮,则始终可以在 *** 作消息中定位网格SelectedItem

<DataGrID x:name="SomeDataGrID"></DataGrID><button cal:Message.Attach="[Click] = [DeleteItem(SomeDataGrID.SelectedItem)]" />

它可能是(也可能是)CM将查看的默认属性,因此您可能不需要指定属性名称,除非您修改了默认约定

<DataGrID x:name="SomeDataGrID"></DataGrID><button cal:Message.Attach="[Click] = [DeleteItem(SomeDataGrID)]" />

编辑

为了澄清:为了让CM找到一个VM来调用DeleteItem方法,它使用当前项的DataContext.在ItemsControl派生控件的情况下,每个项的datacontext指向绑定的项,而不是viewmodel.

为了给CM提供关于它应该尝试解析DeleteItem方法的对象的提示,可以使用Action.TargetWithoutContext附加属性,该属性为 *** 作消息应用目标对象,而不更改绑定行/项的DataContext

您可以使用元素名称语法指向正确的位置:

在这个例子中,我使用了一个网格作为根元素并将其命名为LayoutRoot,然后我使用Elementname语法将动作消息目标指向LayoutRoot.DataContext(它将是viewmodel).你可以使用任何方法(AncestorType或其他)

<GrID x:name="LayoutRoot">    <DataGrIDTemplateColumn WIDth="100">        <DataGrIDTemplateColumn.CellTemplate>            <DataTemplate>                <button Content="Delete" cal:Message.Attach="DeleteFromList($dataContext)" cal:Action.TargetWithoutContext="{Binding DataContext,Elementname=LayoutRoot}" />             </DataTemplate>         </DataGrIDTemplateColumn.CellTemplate>     </DataGrIDTemplateColumn></GrID>

这应该工作!

总结

以上是内存溢出为你收集整理的c# – 当我使用caliburn micro时,如何将wpf网格上的按钮绑定到MVVM上的方法全部内容,希望文章能够帮你解决c# – 当我使用caliburn micro时,如何将wpf网格上的按钮绑定到MVVM上的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1251116.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存