小编Mar*_*ngs的帖子

在分层数据结构中向MVVM添加编辑

这个问题是这个旧问题的后续问题,它更像是一个确认而不是一个开放的问题.

我的ViewModel实例有一个Model的私有实例_modelInst.
ViewModel在编辑期间可以独占访问Model的数据(因此Model不需要实现INotifyPropertyChanged).

现在我有三种方法可以从视图中编辑模型数据:

  1. 直接在Model实例上获取/设置,
    例如,对于简单的值字段,
    return _modelInst.fieldname;
    _modelInst.fieldname = value;
    这个很容易实现...

  2. 创建一个ViewModel实例并对父数据结构
    进行操作,例如对于更复杂的对象类型,如结构:

    • 为该类型创建新的ViewModel.
      ViewModel知道父级及其fieldname.
    • 在ContentControl + DataTemplate中显示它
    • 获取/设置:
      通过使用fieldname作为参数的父方法,
      即使只更改了一个字段,也会覆盖整个原始对象

    这意味着_modelInst为每个结构创建一个由父级实现的新接口(使用更新例程).

  3. 创建ViewModel实例,而不直接了解父类的数据结构,
    例如父类中的(列表)类

    • 为每个类创建一个新的ViewModel

    • 通过以下方式向父级发送更新说明

      1. 命令
      2. 消息
      3. 反射(父
        通过比较实例与所有存储的子代,知道哪个子函数调用了函数)

      所有这些都是一个很大的混乱实现,为可编辑的模型的每个领域创建功能.
      这几乎意味着模型的所有领域..​​....

(4.)可以创建一个通用的ViewModel,它只通过反射工作,其中每个子对象都知道它的父对象和它的字段名(+ index,如果在列表中).
只有root的逻辑才会干扰模型.
但是,该解决方案还需要一种方法来存储其中的字段的路径_modelInst.

有没有其他(更简单)的方法来实现这一目标?
我是否(再次)误解了MVVM的原理?
MVVM是否适合处理大型分层数据结构?

c# data-binding mvvm hierarchical-data two-way-binding

5
推荐指数
1
解决办法
1242
查看次数

WPF中哪个音频播放框架?

我知道这可能听起来像一个主观问题,但我需要一些有关这个主题的有根据的意见:

在C#/ WPF GUI中,我需要播放短波文件作为对用户交互的响应.
规格如下:

  • 低延迟(立即开始播放)
  • 代码应该是本机C#(.NET 4.0)
  • 必须与WPF相处
  • 多个同时播放
  • 对声音缓冲区操作没有限制
  • 保证未来(我想使用几年内仍然会有支持的东西.)
  • 声音播放器模块应该是一个简单的类(= C#代码),而不是封装的dll

到目前为止,我与DirectSound(使用Microsoft DirectX SDK)相处得很好,它符合上面提到的所有要求.从Visual Studio 2010(.Net 4.0)开始,Managed DirectX(MDX)不再受支持,它也从最新的DirectX SDK中消失.

我现在有什么选择?

  • XNA对我来说似乎有点过分(太大),因为我不是在开发游戏,而是开发应用程序.有关更多信息,请参阅此问题.
    它应该是MDX的替代品,但我读了很多关于它的实现的可怕故事.还是所有童话故事?
  • SlimDX可能是一个选项,但它是第三方产品,也是一个相当大的项目.
  • 我知道有一些"较小"的解决方案,每个都有它自己的缺点:
    • MediaElement(仅限WMP10 +)
    • 使用WinMM进行P/Invoke
    • 播放声音
    • 声音播放
    • 媒体播放器
  • 野外有大量的自定义音频库,它们或多或少都能正常工作.
    (NAudio,BASS,waveOut ......)

我真的很困惑我应该用哪个新项目.我不想深入研究一个全新的框架,只是为了发现它的局限性阻止我使用它.

提前致谢!

c# audio wpf .net-4.0

5
推荐指数
1
解决办法
2274
查看次数

如何为数据对象分配 const 成员?

希望这不是重复的。如果是这样,请在评论中指出我,我将再次删除该问题。

我有一个数据对象,其中的数据仅在捆绑包中有效 - 即,在不使其他成员无效的情况下更改一个成员的值是没有意义的。
该数据对象描述了一些图像信息:

struct ImageInfo
{
    ImageInfo(const double &ppix, ...)
        : PpiX(ppix),
        ...
    { }

    const double PpiX;
    const double PpiY;
    const int SizeX;
    const int SizeY;
};
Run Code Online (Sandbox Code Playgroud)

在我的图像对象中,我有一个类型的非常量成员ImageInfo

class MyImageObject
{
    ...
private:
    ImageInfo mMyInfo;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够mMyInfo在运行时进行更改,但前提是它需要一个新的 ImageInfo(...) 实例。

在该MyImageObject::Load()函数中,我想从文件信息中读取此数据,然后ImageInfo使用正确的数据集创建一个实例:

double ppix = ImageFile.GetPpiX();
...
mMyInfo = ImageInfo(ppix, ...);
Run Code Online (Sandbox Code Playgroud)

但我无法编写一个有效的赋值运算符(复制构造函数当然是可能的)。我的解决方案留空mMyInfo,因为我没有引用this

ImageInfo operator=(const ImageInfo &other)
{
    // no reference to *this
    return ImageInfo(other);
} …
Run Code Online (Sandbox Code Playgroud)

c++ constants assignment-operator data-objects

5
推荐指数
1
解决办法
3338
查看次数

如何判断是否在启用 NumLock 的情况下在小键盘输入上按下了 shift?或者至少获得 NumLock 状态?

在 Qt 的 keyPressEvent() 和 keyReleaseEvent() 中,我试图获得键 + 修饰符的数字键盘输入。

使用void MyWidget::keyPressEvent(QKeyEvent *evt),evt->key()给出键码 (Qt::Key) 并evt->modifiers()给出键盘修饰符 (QFlags)。

  • 对于所有“常规”键,我可以检测到所有需要的修饰符(shift、alt、ctrl)。
  • 对于小键盘键,如果 numLock 关闭,我会得到正确的修饰符。
  • 如果 NumLock 开启,我会收到 ctrl 和 alt,但不会收到 shift。

我发现shift 键覆盖了 NumLock

下表显示了有关关键事件的所有可用 Qt 值的读数。
要重现的击键:关闭 NumLock,按下并释放 num_5,然后按下并释放 shift,然后按下 shift -> 按 num_5 -> 释放 num_5 -> 释放 shift,然后将 NumLock 切换为打开并重复相同的按键操作。

table headers:
natSC        = evt->nativeScanCode()
natMods      = evt->nativeModifiers()
kbdMods      = QGuiApplication::keyboardModifiers()
queryKbdMods = QGuiApplication::queryKeyboardModifiers()

NumLock |    Action     |   Event    | evt->key()  | evt->modifiers() | …
Run Code Online (Sandbox Code Playgroud)

c++ keyboard qt

5
推荐指数
2
解决办法
4175
查看次数

为什么可以连接到未声明为 Q_SLOTS 的函数?

我“不小心”将信号连接到QWidget::setToolTip()

bool ok = connect(source, &Source::textSignal, widget, &QWidget::setToolTip);
Q_ASSERT(ok);
Run Code Online (Sandbox Code Playgroud)

......它奏效了。不仅连接成功,函数也被正确调用。

自己试试:
main.cpp

#include <QApplication>
#include <QLineEdit>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLineEdit le;
    bool ok = QObject::connect(&le, &QLineEdit::textChanged, &le, &QWidget::setToolTip);
    Q_ASSERT(ok);
    le.show();
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

setToolTip()未声明为slot.

来自 qwidget.h:

    // [...]
public Q_SLOTS: // start of Q_SLOTS
    void setWindowTitle(const QString &);
#ifndef QT_NO_STYLE_STYLESHEET
    void setStyleSheet(const QString& styleSheet);
#endif
public: // from my understanding, this should end the Q_SLOTS region
#ifndef QT_NO_STYLE_STYLESHEET
    QString …
Run Code Online (Sandbox Code Playgroud)

c++ qt signals-slots qwidget moc

2
推荐指数
1
解决办法
329
查看次数

下拉列表中的默认值

我正在创建一个编辑用户页面,其中包含从数据库中的数据填充的文本框和下拉菜单.

我目前调用一个函数来填充下拉菜单.例如,以下是我用来填充下拉列表的代码:

<select name="manager">;
<?php
// printing the list box select command
foreach($managerDetails as $row){
//Array or records stored in $managerDetails
echo "<option value='${row['userID']}'>
${row['lastName']}, ${row['firstName']}
</option>";
/* Option values are added by looping through the array */
}
?>
</select>
Run Code Online (Sandbox Code Playgroud)

我试图让组合框自动显示数据库中的值.我试图将其作为以下值:

value="<?php echo $userDetails['managerID']; ?>"
Run Code Online (Sandbox Code Playgroud)

谢谢.

html php select

0
推荐指数
1
解决办法
1万
查看次数

QObject connect:无法对"QItemSelection"类型的参数进行排队

我在时间23:59:59传递到第二天时收到以下消息.我不知道(因为代码是由其他人编写的)它来自哪里.有谁能建议如何找出问题?谢谢!

QObject::connect: Cannot queue arguments of type 'QItemSelection'
(Make sure 'QItemSelection' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QItemSelection'
(Make sure 'QItemSelection' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QItemSelection'
(Make sure 'QItemSelection' is registered using qRegisterMetaType().)
Run Code Online (Sandbox Code Playgroud)

qt signals-slots

0
推荐指数
1
解决办法
5950
查看次数

比较运算符==中的共享指针常量

我偶然发现了我正在使用的共享指针的意外行为.

共享指针实现引用计数和分离(例如,复制),如果需要,包含非const使用的实例.
为实现此目的,对于每个getter函数,智能指针都有一个const和一个non-const版本,例如:operator T *()operator T const *() const.

问题:比较指针值nullptr导致分离.

预期:我认为比较运算符总是会调用const版本.

简化示例:(
此实现没有引用计数,但仍显示问题)

#include <iostream>

template<typename T>
class SharedPointer
{
public:
    inline operator T *() { std::cout << "Detached"; return d; }
    inline operator const T *() const { std::cout << "Not detached"; return d; }
    inline T *data() { std::cout << "Detached"; return d; }
    inline const T *data() const { std::cout << "Not detached"; …
Run Code Online (Sandbox Code Playgroud)

c++ const shared-ptr comparison-operators

0
推荐指数
1
解决办法
91
查看次数