绑定到 TabControl SelectedIndex

2024-02-08

我在页面上有一个选项卡控件;它的项目绑定回我的 ViewModel,它还公开了一个 ActiveTabItemIndex,它绑定(两种方式)到我的 xaml 中的 SelectedIndex 属性,并实现 INotifyPropertyChanged 以便我的 TabControl 知道何时更新。

这是(我理解的)MVVM 正确的做事方式,并且 99% 都能正常工作。

class MainWindowViewModel : BaseViewModel, INotifyPropertyChanged
{
    ObservableCollection<TabItemViewModel> _TabItems;
    int _ActiveTabItemIndex;

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }

    void _TabItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
            _ActiveTabItemIndex = _TabItems.IndexOf((TabItemViewModel)e.NewItems[0]);
        RaisePropertyChanged("ActiveTabItemIndex");
    }

    public ObservableCollection<TabItemViewModel> TabItems
    {
        get
        {
            if (_TabItems == null)
            {
                _TabItems = new ObservableCollection<TabItemViewModel>();
                _TabItems.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_TabItems_CollectionChanged);
            }
            return _TabItems;
        }
    }

    public int ActiveTabItemIndex
    {
        get
        {
            return _ActiveTabItemIndex;
        }
        set
        {
            _ActiveTabItemIndex = value;
        }
    }
}

这样,我对 TabItems 集合所做的任何操作都会反映在 TabControl 上,并且当我添加新项目时,它会被自动选择。这是一种享受;但是,当将第一个项目添加到空选项卡控件时,它看起来像这样:

显示选项卡内容,但未选择该选项卡。我需要手动单击该选项卡才能使其看起来正确:

就好像选项卡的绘制与其内容的绘制之间存在某种脱节。我知道绑定正在工作,因为后续选项卡已正确处理,如果我完全删除绑定,则在手动选择选项卡之前,第一页不会显示其内容。如果有人看过这个或可以阐明一些情况,我们将不胜感激!谢谢你们 :)


仅在 setter 中引发属性更改事件;您可以将其视为允许属性本身决定“更改”的含义,并通过扩展来控制事件何时触发(并使其执行您期望的操作):

public int ActiveTabItemIndex
{
    get{ return _ActiveTabItemIndex; }
    set
    {
        if(_ActiveTabItemIndex != value)
        {
            _ActiveTabItemIndex = value;
            RaisePropertyChanged("ActiveTabItemIndex");
        }
    }
}

只是改变

_ActiveTabItemIndex = _TabItems.IndexOf(...);

to

ActiveTabItemIndex = _TabItems.IndexOf(...);

并从 _TabItems_CollectionChanged 中删除 RaisePropertyChanged 调用

有时您需要在属性设置器之外引发属性更改通知,但那是为了更加复杂的一天:)

顺便说一句,INotifyPropertyChanged 应该在您的 BaseViewModel 上实现。看看绝对精彩的MVVM 轻型工具包 http://mvvmlight.codeplex.com/- 它包含您在使用 MVVM 的每个项目中必须复制的所有代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绑定到 TabControl SelectedIndex 的相关文章

随机推荐

  • 获取jstree的已检查节点ID列表[重复]

    这个问题在这里已经有答案了 我是新来的jstree and jQuery并且在我的测试树中进行节点检查时遇到了一些问题 用户首先应勾选自己需要的节点 然后点击 概括 按钮以获取警报窗口中已检查节点的 ID 列表 我还想导出 ID 列表以供进
  • VB.NET 中的 WScript?

    这是我的程序中的一段代码 WSHShell WScript CreateObject WScript Shell 但由于某种原因 WScript 没有声明 我知道这段代码可以在 VBScript 中运行 但我正在尝试让它在 vb net 中
  • Python 中的机器 Epsilon

    我目前正在学习的一本手册 我是新手 说 相差小于机器 epsilon 的数字在数值上是相同的 使用 Python 可以通过键入获得浮点值的机器 epsilon eps numpy finfo float eps 现在 如果我检查 1 eps
  • 连接时 , 和 + 有什么区别?

    过去几个月我一直在用 c 编码 但每次连接时我总是对逗号之间的区别感到困惑 和加号 有时 适用于连接 其他时候 用来 我真的不明白其中的区别 请帮帮我 这是代码 class Faculty string firstName lastName
  • Eclipse 上的 Golang:Mac 上“资源没有相应的 Go 包”

    如标题所述 我在 Eclipse 上运行 Golang 代码时遇到问题 我目前使用的是Mac 我使用homebrew安装了go 目前 go安装的文件夹如下 usr local Cellar go 1 5 2 运行终端并输入后open bas
  • 如何刷新页面并保持元素不刷新(持久)直到用户单击提交?

    我正在寻找一种 jQuery 方法来在刷新页面时将页面元素保留在用户屏幕上 当我刷新页面并且丢失 jQuery 页面中的内容时 它会发生变化 我需要该页面是持久的 如何刷新页面并保持元素不刷新 持久 直到用户单击提交按钮 如何才能做到这一点
  • 在 android 中,相机“camera.setParameters”失败

    at android hardware Camera native setParameters Native Method at android hardware Camera setParameters Camera java 647 a
  • Microsoft VBScript 运行时错误:输入超过文件结尾错误

    我收到此错误 C se2 vbs 28 6 Microsoft VBScript 运行时错误 输入超出文件结尾 当我运行脚本时 第 28 行斜体 Dim strInput Dim filesys Dim path Set filesys C
  • Flutter Web:如何在 Flutter Web 应用程序中禁用浏览器的后退按钮

    成功登录后 用户重定向到主页 但当用户单击浏览器后退按钮时 它很容易重定向到登录屏幕 我应该怎么做才能禁用向后重定向 class SecondPage extends StatelessWidget override Widget buil
  • HTTP_ORIGIN 的安全性如何?

    我想查明来自第三方网站的传入 HTTP REQUEST 调用是否来自我定义的域列表 我知道可以使用HTTP REFERER来查找第三方域在哪里 但它不够安全 人们可以欺骗它或使用 Telnet 来伪造它 那么 HTTP ORIGIN 怎么样
  • 在互联网上哪里可以找到直方图差异算法?

    我在哪里可以找到互联网上的直方图差异算法 我想比较两个文本并找出差异 目前我正在尝试耐心差异算法 但这并不那么有效 我听说直方图差异算法是耐心差异的改进版本 The git软件实现了耐心和直方图差异算法 也可以看看 git diff pat
  • python OpenCv IMREAD_UNCHANGED 只返回三个通道

    我试图找出我的代码有什么问题 我想加载包含 Alpha 通道的图像 官方网站的描述如下 cv IMREAD UNCHANGED 如果设置 则按原样返回加载的图像 带有 Alpha 通道 否则会被裁剪 这是我的尝试 import cv2 as
  • 如何从气流传感器中提取 xcom 值?

    主要问题 我正在尝试创建一个 BigQuery 表 如果不存在 方法 使用 BigQueryTableSensor 检查表是否存在 并根据返回值 使用 BigQueryCreateEmptyTableOperator 创建或不创建新表 Pr
  • 如何在 Windows 和 MAC 上使用 Python 检测进程是否正在运行

    我正在尝试找到一种方法来使用 Python 检测进程是否在 Windows 操作系统的 Windows 任务管理器和 MAC 操作系统的 Macintosh 活动监视器中运行 有人可以帮我解决一下代码吗 psutil https githu
  • 在 TomEE+ 上使用 JAX-RS 时出现“无资源方法”

    使用 Stock TomEE 我无法让简单的 JAX RS 资源工作 我不断收到以下错误 Jun 30 2012 5 09 59 PM org apache cxf jaxrs utils ResourceUtils checkMethod
  • 如何绕过Firebase缓存刷新数据(在Android应用程序中)?

    在大多数时间必须离线工作的 Android 应用程序上 当它在线时 我需要执行一些同步操作 即 User myUser MyclientFacade getUser If myUser getScore gt 10 DoSomething
  • 无法复制/移动文件名末尾带有空格的文件

    真是太疯狂了 我已经使用 Far 2 0 创建了一个文件 http www farmanager com http www farmanager com 也许您可 以使用其他文件管理器 它的文件名是 C 123 txt 是的 文件路径末尾有
  • 在Android中,有没有办法获取电池电流? [复制]

    这个问题在这里已经有答案了 BatteryManager 类没有电流指标 http developer android com reference android os BatteryManager html http developer
  • 窗口服务的通知图标

    我开发了 win 服务程序 它从本地驱动器读取 Excel 文件 然后将此文件值保存到数据库 现在我想开发一个通知图标 该图标将在之后显示一条消息 Excel 文件已保存在数据库中 我的服务将启动并将 Excel 文件保存到数据库 请给我一
  • 绑定到 TabControl SelectedIndex

    我在页面上有一个选项卡控件 它的项目绑定回我的 ViewModel 它还公开了一个 ActiveTabItemIndex 它绑定 两种方式 到我的 xaml 中的 SelectedIndex 属性 并实现 INotifyPropertyCh