使用 Prism 库将 ListView 项目传递给命令

2023-12-04

我正在尝试执行基于列表视图项目数据的方法。除此之外,只有当列表视图项的“CanExecute”方法返回 true 时,才应启用触发命令的按钮。

“MyCommand”和“CanExecute”这两种方法都包含在我的 ViewModel 中。 不幸的是,我不确定如何将项目信息正确传递给这两种方法,以符合 PRISM 6 框架。

所以我的第一个方法是这样做:

Model

public class MyModel
{
    public string Name { get; set; }
    public string Version { get; set; }
    public int Identifier { get; set; }
}

视图模型

public class MyViewModel : BindableBase
{

    private ObservableCollection<MyModel> _models = new ObservableCollection<MyModel>();
    public ObservableCollection<MyModel> Models
    {
        get { return _models; }
        set { SetProperty(ref _models, value); }
    }

    public DelegateCommand VerifyCommand { get; set; }


    public MyViewModel()
    {
        //Add test data
        for (int i = 0; i < 5; i++)
        {
            MyModel model = new MyModel();
            model.Name = "Random Text";
            model.Version = "Random Text";
            model.Identifier = i;

            Models.Add(model);
        }

        //Doesn't work, because I don't reference to "Models"
        //How to do that?
        VerifyCommand = new DelegateCommand(DoCommand, CanExecute).ObservesProperty<string>(() => Name).ObservesProperty<string>(() => Version);
    }

    private bool CanExecute()
    {
        //Obviously this doesn't work, because "Version" and "Name" 
        //don't belong to the selected "Models" item of the listview

        //What is the "bridge", to know which item of Models was clicked (button)
        return !String.IsNullOrWhiteSpace(Version) && !String.IsNullOrWhiteSpace(Name);
    }

    private void DoCommand()
    {
        //Do something special
    }
}

View

<ListView ItemsSource="{Binding Models}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Height="Auto" Margin="0,0,0,10">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <TextBox Grid.Row="0" Tag="VERSION" Text="{Binding Version, UpdateSourceTrigger=PropertyChanged}" />
                <TextBox Grid.Row="1" Tag="NAME" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
                <Button Command="{Binding ElementName=root, Path=DataContext.VerifyCommand}" Content="Verify" Grid.Row="2">
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

View 和 ViewModel 之间的链接是通过使用以下方式完成的:

prism:ViewModelLocator.AutoWireViewModel="True"

在我看来(这有效)。

总结来说: 它是如何工作的,PRISM 符合 1. 仅当 CanExecute 为 true 时才启用项目按钮,2. 执行“DoCommand”方法并将项目信息传递给该方法(按钮的根元素 -> 在本例中为 ListViewItem (MyModel )。

任何帮助将不胜感激。


简短的回答:将命令放入项目的视图模型中。

长答案:

这是我在上面评论中的意思的一个例子。我省略了集合的可观察性,如果您确实需要可观察的模型集合和可观察的视图模型集合,请为大量无聊的双向同步代码做好准备......

Model:

internal class ItemModel
{
    public string Name { get; set; }
    public string Version { get; set; }
    public int Identifier { get; set; }
}

ViewModel(用于项目集合的一个,即您的MyViewModel,以及该项目的一个):

internal class MyCollectionViewModel : BindableBase
{
    private readonly List<ItemModel> _models = new List<ItemModel>();

    public MyCollectionViewModel()
    {
        //Add test data
        for (var i = 0; i < 5; i++)
            _models.Add( new ItemModel
            {
                // to prove that CanExecute is actually evaluated...
                Name = i == 3 ? "Random Text" : string.Empty,
                Version = "Random Text",
                Identifier = i
            } );
    }

    public IReadOnlyCollection<ItemViewModel> TheCollection => _models.Select( x => new ItemViewModel( x ) ).ToList();
}

internal class ItemViewModel : BindableBase
{
    public ItemViewModel( ItemModel item )
    {
        _item = item;
        VerifyCommand = new DelegateCommand( () =>
                                             {
                                                 /* Do something */
                                             }, () => !string.IsNullOrWhiteSpace( Version ) && !string.IsNullOrWhiteSpace( Name ) );
    }

    public string Name => _item.Name;
    public string Version => _item.Version;
    public int Identifier => _item.Identifier;

    public DelegateCommand VerifyCommand
    {
        get;
    }

    private readonly ItemModel _item;
}

View:

<ListView ItemsSource="{Binding TheCollection}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Height="Auto" Margin="0,0,0,10">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBox Grid.Column="0" Text="{Binding Version, Mode=OneWay}" />
                <TextBox Grid.Column="1" Text="{Binding Name, Mode=OneWay}" />
                <Button Grid.Column="2" Command="{Binding VerifyCommand}" Content="Verify"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Prism 库将 ListView 项目传递给命令 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • WPF PRISM 事件订阅不会消亡

    我有一个 PRISM RegionManager 其中有几个区域 顶部的功能区区域和其下方用于我的视图的主要内容区域 相当基本 该应用程序以主要内容区域中的 主页 视图开始 当我单击功能区上的按钮时 我将第二个视图注入内容区域并在区域管理器
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 如何导出具有依赖关系的 SVN 存储库的一部分?

    我正在尝试使用迁移 SVN 存储库的一部分svnadmin dump 提供的 svndumpfilter 工具不管理导出中未包含的目录的复制 移动 重命名依赖项 有没有一个工具可以管理这些依赖关系 我发现了 Simon Tatham 的一个
  • 为每个类别选择 N 条记录并按 X 排序

    我有一个包含博客文章的数据库表 我想在主页上显示每个类别的一篇 或多篇 帖子 例如按日期排序 所以我的帖子表如下所示 id title description cat filename date 我将如何创建这样的查询 我想过使用 grou
  • 如何计算正弦曲线两端的面积

    给定这个数据集 y lt c 13 16 35 40 28 36 43 33 40 33 22 5 27 31 29 25 26 31 26 24 25 29 23 4 t lt 1 24 我的目标是计算两个面积 第一个区域将仅集成来自零线
  • 使用 Grunt Uglify 进行动态映射和连接

    我正在尝试使用动态映射并使用 Grunt Uglify 连接 Javascript 文件 我有以下无法正常工作的情况 这是我的文件夹结构 javascript account custom js bills billing one js b
  • elasticsearch:如何索引仅是停用词的术语?

    我在后台使用 elasticsearch 构建了自己的小搜索 取得了很大的成功 但有一件事我在文档中找不到 我正在索引音乐家和乐队的名字 有一个名为 The The 的乐队 由于停用词列表 该乐队从未被索引 我知道我可以完全忽略停用词列表
  • 自定义注释图像仅在程序开始时旋转(Swift-iOS)

    请在这里帮助新手 iOS 开发者 所以 我有一个计时器 它定期从提供公交车实时位置的 xml 表中获取公交车的纬度和经度 我能够设置解析器 为总线运动设置动画并为总线设置自定义 箭头 图像 然而 问题是 每次获得纬度和经度的新值时 我无法旋
  • forEach 循环中的 setTimeout

    如果满足特定条件 我想延迟调用 forEach 循环中的另一个函数 但我不理解这种情况下的 setTimeout function checkName person console log checking name of person n
  • 鼠标悬停时更改映射图像热点的背景

    我有 3 个多边形的图像图 实际的图像热点是由多条曲线和边缘组成的复杂形状 img src images map gif alt HTML Map border 0
  • Python 中“dict”的内存分配是如何工作的?

    我在玩字典时发现了这个 import sys Square1 Square2 Square3 for i in range 1 8 Square1 i i 2 for i in range 1 11 Square2 i i 2 for i
  • 对象引用未设置到对象的实例[重复]

    这个问题在这里已经有答案了 我收到一个错误VB Net 未将对象引用设置为对象的实例 你能告诉我这个错误的原因是什么吗 该对象在使用前尚未初始化 在代码文件的顶部输入 Option Strict On Option Explicit On
  • 在 Objective C 中使用 for-in 循环访问特定类型的对象 [重复]

    这个问题在这里已经有答案了 我正在运行一个 for in 循环NSMutableArray 有类的实例A在数组中也有一些实际上是其子类的实例B 所以如果我只想要子类的成员B 我正在检查我得到的每个对象的类if循环体内的条件 有没有可能不写这
  • 如何在 ASP.NET Membership Cookie 中存储自定义数据

    谁能给我一个关于如何在 ASP NET 会员 cookie 中存储自定义数据的示例 或为我指明正确的方向 我需要向 cookie 添加一些自定义属性 例如 UserID 和 URLSlug 并且能够以与检索用户名相同的方式检索信息 Edit
  • 在 Python 2.7 中的 lambda 函数内使用 print 函数时出错

    我正在 Python 2 7 中运行一个简单的代码 但它给了我语法错误 hello lambda first print Hello first 报告的错误是SyntaxError invalid syntax Python 不允许在以下位
  • varchar 和 nvarchar 有什么区别?

    难道只是这样吗nvarchar支持多字节字符吗 如果是这样的话 除了存储问题之外 使用真的有什么意义吗 varchars An nvarchar列可以存储任何 Unicode 数据 Avarchar列仅限于 8 位代码页 有些人认为varc
  • 如何在内存中创建一个文本文件并在其上写入内容并在客户端中打开记事本并在其中打开该文件?

    我如何在内存中创建一个文本文件 Ram gt Save NoWhere 并在其上写入一些内容并在客户端浏览器顶部打开记事本并在其中打开该文本文件并让用户自行保存 gt 在代码后面 提前感谢 此致 你不能那样做 您所能做的就是将文件内容写入正
  • 从特殊格式的文本文件中读取数据

    我正在使用 Ashwini Chaudhary 善意建议的这种方法 将特定格式的文本文件中的数据分配给字典 keys map str strip next f split Key t 1 split t words map str stri
  • 如何处理 Cassandra 中的动态列

    我正在通过 Python 脚本将 JSON 数据加载到 Cassandra 表 但很少有 Json 文件具有比平常更多的列 目前我已经创建了包含 100 列的表并且能够插入所有列 但很少有 json 文件的列数超过 100 这要怎么处理呢
  • JSON 有时是数组有时是对象

    我正在使用一个 API 它对特定字段的响应有时是对象 有时是对象数组 我创建了一个结构来解组 json 响应 效果很好 但是 在 json 响应具有对象数组的情况下 显然解组失败 在 Go 中我该如何处理这种情况 Single Respon
  • JQuery IE

    我的 IE 有问题 我有一个具有这种样式的图层 使其透明且全屏 position absolute top 0px left 0px right 0px bottom 0px background color 000000 filter a
  • 使用 Prism 库将 ListView 项目传递给命令

    我正在尝试执行基于列表视图项目数据的方法 除此之外 只有当列表视图项的 CanExecute 方法返回 true 时 才应启用触发命令的按钮 MyCommand 和 CanExecute 这两种方法都包含在我的 ViewModel 中 不幸