- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试搜索类似问题的答案,但找不到适合这种情况的答案。
我有一个看起来像这样的主窗口(有些部分被省略):
<Window x:Class="test.MainWindow"
xmlns:local="clr-namespace:test"
xmlns:Views="clr-namespace:test.Views">
<Grid>
<DockPanel>
<StatusBar>
<StatusBarItem>
<Views:ProfileView />
</StatusBarItem>
<Separator />
<StatusBarItem>
<Views:StatusView />
</StatusBarItem>
</StatusBar>
</DockPanel>
</Grid>
</Window>
代码隐藏:
using System.Windows;
namespace test
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// some stuff done here
}
}
和两个用户控件:
<UserControl x:Class="test.Views.StatusView"
xmlns:local="clr-namespace:test.Views"
xmlns:ViewModels="clr-namespace:test.ViewModels">
<UserControl.DataContext>
<ViewModels:StatusViewModel/>
</UserControl.DataContext>
<Grid>
<Border>
<TextBlock Text="{Binding Status}" />
</Border>
</Grid>
</UserControl>
和:
<UserControl x:Class="test.Views.ProfileView"
xmlns:local="clr-namespace:test.Views"
xmlns:ViewModels="clr-namespace:test.ViewModels" MouseEnter="UserControl_MouseEnter" MouseLeave="UserControl_MouseLeave">
<UserControl.DataContext>
<ViewModels:ProfileViewModel/>
</UserControl.DataContext>
<Grid>
// some stuff done here
</Grid>
</UserControl>
代码隐藏:
using System.Windows.Controls;
namespace test.Views
{
public partial class StatusView : UserControl
{
public StatusView()
{
InitializeComponent();
}
}
}
和:
using System.Windows.Controls;
namespace test.Views
{
public partial class ProfileView : UserControl
{
public ProfileView()
{
InitializeComponent();
}
private void UserControl_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
// Update status bar text
}
private void UserControl_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
// Update status bar text
}
}
}
每个 UserControl 都有自己的 ViewModel 设置为 DataContext:
using System;
using System.ComponentModel;
namespace test.ViewModels
{
class StatusViewModel : INotifyPropertyChanged
{
private string _status = string.Empty;
public string Status
{
get { return _status; }
set { _status = value; OnPropertyChanged("Status"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public StatusViewModel() { }
}
}
和:
using System;
namespace test.ViewModels
{
class ProfileViewModel
public ProfileViewModel() { }
// some stuff done here
}
}
正如您从代码中看到的那样,ProfileView 具有 MouseEnter 和 MouseLeave 事件,我想在这些事件上设置 StatusView 中的 TextBlock.Text 值(通过它的 ViewModel.Status 属性)。
此处未显示,但其他类也应该能够使用相同的原理以线程安全的方式更新状态栏的值。
我如何实现这一目标?
我想过使用 DependencyPropertyes 或 Delegates and Events,但不知道该怎么做,因为目前,UserControl(和其他)都是通过 MainWindow 中的 XAML 实例化的,而不是通过代码隐藏。我认为这就是应该这样做的方式(如果我要遵循 MVVM 并且有工作分离 - 设计师在设计而程序员在编程)但是,这正是我不知道如何解决这个问题的原因.
感谢您的帮助。
最佳答案
我强烈推荐使用 MVVM Light。
您可以使用 MVVM Light Messenger。它是一个允许在对象之间交换消息的类。 Messenger 类主要用于在 View 模型之间发送消息: http://dotnetpattern.com/mvvm-light-messenger
PS:我还建议使用命令绑定(bind)而不是事件处理程序(这不像 MVVM)。
关于c# - 如何更新 MainWindow 中 StatusBarItem 中的 WPF UserControl 属性形成另一个具有不同 DataContexts 的 UserControl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785277/
我做了我的研究,人们倾向于使用 ViewModel 来实现这一点,但我有点陷入其中。 我有一个 public ObservableCollection orderList { get; set; }
当用户更改主题时,我使用 mainWindow.webContents.send 更改 DOM 中的类。我还将它保存在商店中,在键 theme 下。 mainWindow.webContents.se
所以我有一个名为 MainWindow 的空主框架和一个 WelcomeWidget,它在程序启动时立即调用并加载到主框架中。然后我想要 WelcomeWidget 中的按钮 next_btn 调用
像a一样用slot和signal连接就对了 connect( ui->widget, SIGNAL( GetSquareParameters( int &, int &,int &,int &)),
我正在尝试构建一个桌面应用程序,使用 Electron 在 web View 中打开 gmail。在我的主文件中,我已经加载了这样的网址 mainWindow.loadURL("https://gma
在我的 (Py)Qt4 应用程序中,直到用户使用 command-tab 切换离开应用程序,然后使用 command-tabs 切换回它,主窗 Eloquent 会出现。 奇怪的是这个问题仅在双击启动
我有一个带有菜单的MainWindow,可以打开一个注册对话框。如何在注册后更新 MainWindow 中的 tableView? 这是我的 MainWindow 实现: MainWindow::Ma
我想使用 PyQt5 和 QtDesigner 开始一个新项目。首先,我只是复制了 PyQt4 中以前项目中的代码,并将其调整为 PyQt5 中的更改。因此,启动 Main Window 和更新应用程
我正在尝试制作一个包含 MainWindow.cpp 和一个 dialog1.cpp 的程序,我需要将一个字符串从我的对话框的 QLineEdit 传递到 MainWindow.cpp 中的一个函数。
我有一个使用 Qt Designer 制作的 PyQt5 MainWindow。 这个窗口应该抓取网站并在找到后在 TreeView 中列出抓取的链接。 每次抓取新链接时,我都可以创建一个模型 QSt
我理解 Static 和 Instance 的概念,但我很困惑,当我有一个只有 1 个实例的类时,我应该使用哪个实例,这是在我的应用程序开始时调用的实例 (=Application.Current .
我正在尝试将 MainWindow 的 DataContext 设置为其在 App.OnStartup 中的 ViewModel。我注意到这样做时,MainWindow() 构造函数被调用了两次,我看
是否可以将相对于 MainWindow 的点转换为相对于其子控件之一?例如,假设一个控件的左上角位于 500, 500 相对于 MainWindow 什么代码会将该数字转换为 (0, 0)?我希望解决
所以我按照以下网站上的指南来限制文本框可以接受的字符。 http://www.rhyous.com/2010/06/18/how-to-limit-or-prevent-characters-in-a
我目前正在使用 QT Creator 创建用于查看的 UI 文件,我是 QT 初学者。 有一部分我很好奇,我如何创建另一个类,比如 GraphicView,以便我可以将信号和槽发送到该类而不是主窗体?
我在 MainWindow.xaml.cs 中有这个: public partial class MainWindow : Window { public double _frameCount
我有用户控件,它有两个控件 标签 和 文本 block 并且在我的 MainWindow 中,我有一个 List
我有一个关于 Scope 的初学者问题。在 MainWindow 类中,我创建了用于数据绑定(bind)的 ModelView 类的实例,以及具有要显示的 Leaves 属性的 Cabbage 类的实
首先,在主窗口中看到这段代码 我创建了一个名为 RightPanel 的用户控件,并将其命名为 MainWindow.xaml rightPanel 例如,在用户
首先,在主窗口中看到这段代码 我创建了一个名为 RightPanel 的用户控件,并将其命名为 MainWindow.xaml rightPanel 例如,在用户
我是一名优秀的程序员,十分优秀!