WPF 列表视图之间的多对多绑定

发布于 2024-10-25 18:57:04 字数 190 浏览 1 评论 0原文

我有两个列表视图,一个用于图像,一个用于标签,它们具有多对多关系。

两个列表视图都绑定到 EF 对象的 ObservableCollection。标签列表视图还有一个复选框列。

当我从列表视图中选择图像时,我希望在另一个列表视图上检查关联的标签。我需要 TwoWay 绑定来根据是否检查来创建和删除关系。

我该怎么做?

I have two listviews, one for Images and one for Tags, which have a many-many relationship.

Both listviews are bound to ObservableCollection of EF objects. The Tag listview also has a checkbox column.

When I select an Image from the listview I'd like the associated Tags to be checked on the other listview. I need TwoWay binding to create and remove the relationships based on being checked or not.

How can I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岁月静好 2024-11-01 18:57:04

在你的VM中,你有两个所有图像和标签的ObservableCollection...我认为你可以使用关联图像或标签的另外两个ObservableCollection,当你选择一个图像时,你可以将关联的标签与这个ObservableCollection绑定,反之亦然。

其他解决方案您可以将关联的项目与所选项目绑定(“SelectedItems={Binding Path=SelectedItem.Tags, ElementName=MyImageListBox}”或类似的内容)。

in your VM you have two ObservableCollection of all Images and Tags... I think you can use two others ObservableCollection of associated Images or Tags, when you select an Image you can bind the associated Tags with this ObservableCollection and vise versa.

Other solution you can bind the associated items with selected item ("SelectedItems={Binding Path=SelectedItem.Tags, ElementName=MyImageListBox}", or something like that).

ら栖息 2024-11-01 18:57:04

我的工作如下:

  • 我已经扩展了我的标签模型以具有 MatchesImage 布尔属性
  • 我已将我的 listviewitem 中的复选框双向绑定到此属性
  • getter 获取 CurrentImage 并返回 CurrentImage.Tags.Contains(this)
  • 当我更改属性设置器中的复选框我从视图模型中检索 CurrentImage(我的视图模型是全局资源)并根据值从其标签集合中添加/删除标签
  • 我可能会将 CurrentImage 更改为可通过数据存储库访问,而不是viewmodel

大致如下:

public partial class Tag : INotifyPropertyChanged

  public bool MatchesImage {
    get
    {
        Image img = DataRepository.CurrentImage;
        return (img != null) ? this.Images.Contains(img) : false;
    }
    set
    {
        Image img = DataRepository.CurrentImage;
        if (img != null)
        {
            if (value)
                img.Tags.Add(this);
            else
                img.Tags.Remove(this);
            OnPropertyChanged("MatchesImage");
        }
    }
  }
}

I've got this working as follows:

  • I have extended my Tag model to have an MatchesImage boolean property
  • I have bound the checkbox in my listviewitem twoway to this property
  • The getter gets the CurrentImage and returns CurrentImage.Tags.Contains(this)
  • When I change the checkbox in the property setter I retrieve the CurrentImage from my viewmodel (my viewmodels are global resources) and add/remove the Tag from it's Tags collection based on value
  • I will probably change CurrentImage to be accessible via a data repository, instead of the viewmodel

Something along the lines of:

public partial class Tag : INotifyPropertyChanged

  public bool MatchesImage {
    get
    {
        Image img = DataRepository.CurrentImage;
        return (img != null) ? this.Images.Contains(img) : false;
    }
    set
    {
        Image img = DataRepository.CurrentImage;
        if (img != null)
        {
            if (value)
                img.Tags.Add(this);
            else
                img.Tags.Remove(this);
            OnPropertyChanged("MatchesImage");
        }
    }
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文