c# - 如何在绑定(bind)到 Canvas 的集合中找到具有特定值的项目

标签 c# wpf mvvm

我为此谷歌搜索了一下,但没有得到任何真正的答案。可能是因为我的问题可能有点含糊。开始了:

假设我有一个 ObservableCollection<SomeModel>包含一堆模型。然后,我将相应的 View 添加到 Canvas。在Window的资源中指定这个,然后绑定(bind)Canvas的ItemsSourceObservableCollection<SomeModel> .这很好用。 SomeModel绑定(bind)到SomeView,这是一个UserControl。

现在,当此 View 获得焦点时,或者当我在其上按下鼠标时,我希望将其标记为“已选择”。不知何故,我想在包含我的 Canvas 的窗口的代码隐藏中有一个属性,我总是可以在其中获取所选项目。

我一直在考虑使用 BindingList 而不是 ObservableCollection ,当 IsSelected模型上的属性发生变化,然后一个方法将从列表中提取所选项目。但这似乎有点影响性能,因为我会收到有关项目所有更改的通知。

我怎样才能做到这一点?

最佳答案

有多种方法可以解决这个问题。但可能最简单的方法是使用 ListBox 并绑定(bind)到它。 ListBox,因为它具有可绑定(bind)的 ItemsSource 和一个 SelectedItem 属性,该属性具有当前在其中选择的项目。如果您想在 .cs 文件后面的代码中执行某些操作,它还会在选择更改时调用 SelectionChanged 事件。

我建议在您的 View 模型中保留 ObservableCollection 以保持 MVVM 的真实性。

如果 ListBox 的样式或位置不适合您,请将模板替换为更适合您需要的样式。

如果以上内容对您不起作用,您可以查看行为,但最好保持简单。

更新

这就是您构建 View 的方式。请注意,ItemsPanel 属性绑定(bind)到 UserControl.Resources 部分中已定义的 ItemsPanelTemplate,该模板指定用于放置项目的 Canvas 。

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:local="clr-namespace:SilverlightApplication1"
x:Class="SilverlightApplication1.View1"
d:DesignWidth="640" d:DesignHeight="480">
<UserControl.Resources>
    <local:View1Model x:Key="View1ModelDataSource" />
    <ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
        <Canvas />
    </ItemsPanelTemplate>   
</UserControl.Resources>

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource View1ModelDataSource}}">
    <ListBox Margin="80,85,183,54" ItemsPanel="{StaticResource ItemsPanelTemplate1}" ItemsSource="{Binding DataModelCollection}"/>
</Grid>

关于 View 模型

public class View1Model
{
     private ObservableCollection<SomeModel> _DataModelCollection;

     public ObservableCollection<SomeModel> DataModelCollection
     {
        get { return this._DataModelCollection; }
        set { this._DataModelCollection = value; }
     }
 }

应该注意的是,Canvas 本身没有任何逻辑让用户在运行时在其上移动控件。

关于c# - 如何在绑定(bind)到 Canvas 的集合中找到具有特定值的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7401820/

相关文章:

c# - 如何在 wpf 对话框中选择默认按钮?

c# - 如何在父级折叠时关闭弹出窗口?

c# - 在 WPF 中处理文本框上的 Enter 事件时,如何接受 Ctrl+Enter 作为返回?

mvvm - 如何使用MVVM模式更新UWP数据透视表外观

android - 使用 retrofit 在 mvvm 中处理 Rxjava 的错误

c# - 无法验证 Windows Server 证书的服务总线

c# - for循环中的条件是否在每次迭代中都被评估?

c# - 在 C# MVC 中验证枚举值。发生部分验证 - 如何更改验证行为?

c# - 如何根据条件更改模型的可编辑属性

swift - RxSwift、ViewModels 和 UI 绑定(bind)