小编Tho*_*enz的帖子

ViewModel中的WPF相关属性是否违反了MVVM最佳实践?

这是一个详细说明的示例:

我在我的视图中使用ItemsControl动态创建一个简单的条形图,并将项目绑定到我的BarGraphViewModel中的BarViewModel集合(每个包含一个值的百分比).每个酒吧应该有不同的颜色.颜色应该从一个集合中选择,例如{Color1, Color2, ..}

集合本身是不变的,但条数将取决于具体情况.

一个简单的解决方案是创建一个简单的BarViewModel,如下所示:

public class BarViewModel
{
    public int Percentage { get; set; }

    public SolidColorBrush Stroke { get; private set; }

    public BarGraphViewModel(SolidColorBrush stroke)
    {
        Stroke = stroke;
    }
}
Run Code Online (Sandbox Code Playgroud)

(为了简洁,我省略了属性更改和验证实现)

现在我可以从我的BarGraphViewModel为每个百分比创建一个BarViewModel,并传入从我的Color集合创建的相应ColorBrush.

然后在Xaml中我将创建一个简单的ItemsTemplate,它将绑定到这些属性.

只有现在,因为它包含一个SolidColorBrush类型的属性,我的ViewModel依赖于Presentation框架,如果我想在另一个环境中使用它,它将不得不被更改.

这是否会打破MVVM最佳实践,或者它是否可以接受(你必须在某处绘制线条或者事情变得太复杂)

我只是想看看其他人对此的看法,以及是否有其他解决方案让ViewModel完全不了解Presentation Layer而不会太复杂.我可以想象ValueConverters可以提供帮助吗?

wpf mvvm separation-of-concerns

9
推荐指数
2
解决办法
1410
查看次数

NUnit的Is.Equal对于从泛型类派生的类不能可靠地工作吗?

今天我遇到了NUnit的以下问题.

我有一个类,派生自泛型类.我开始做一些序列化测试,并使用NUnit的Is.EqualTo()函数测试相等性.

当一个应该失败的测试通过时,我开始怀疑出现了问题.当我使用obj1.Equals(obj2)而不是它应该失败时.

为了调查我创建了以下测试:

namespace NUnit.Tests

{

using Framework;

    public class ThatNUnit
    {
        [Test]
        public void IsNotEqualTo_ClientsNotEqual_Passes()
        {
            var client1 = new DerrivedClient();
            var client2 = new DerrivedClient();

            client1.Name = "player1";
            client1.SomeGenericProperty = client1.Name;
            client2.Name = "player2";
            client2.SomeGenericProperty = client2.Name;

            Assert.That(client1.Equals(client2), Is.False);
            Assert.That(client1, Is.Not.EqualTo(client2));
        }

        [Test]
        public void IsNotEqualTo_ClientsAreEqual_AlsoPasses_SomethingWrongHere()
        {
            var client1 = new DerrivedClient();
            var client2 = new DerrivedClient();

            client1.Name = "player1";
            client1.SomeGenericProperty = client1.Name;
            client2.Name = client1.Name;
            client2.SomeGenericProperty = client1.Name;

            Assert.That(client1.Equals(client2), Is.True);
            Assert.That(client1, Is.Not.EqualTo(client2));
        }
    }

    public class …
Run Code Online (Sandbox Code Playgroud)

c# generics tdd nunit unit-testing

8
推荐指数
1
解决办法
1773
查看次数

如何创建侦听文件描述符的Python套接字服务器?

我正在尝试使用Javascript(Nodejs)应用程序与Python应用程序进行通信.

我使用绑定到我的localhost和特定端口的套接字工作.

为了使事情更简单(例如,当部署到可能不允许我在多个端口上侦听的环境时),我想改变我的实现以使用绑定到文件描述符的套接字.

我搜索了高低,但我找到的所有例子都使用了端口.

基本上我需要来自Nodejs文档(指定路径的版本)的此示例的Python服务器计数器部分:

var client = net.connect({path: '/tmp/echo.sock'}.

有人可以提供一个简单的例子来展示,创建和绑定文件描述符套接字并在其上处理数据和/或指向正确的方向吗?

python sockets ipc node.js

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

如何捕获Http.Conduit的simpleHttp抛出的404状态异常

我正在尝试下载html文件中包含的所有png文件.我很难捕获404状态异常,而我的程序只是崩溃了.

以下是一些示例:

import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L

main = do
    let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"    
    imgData <- (simpleHttp badUrl) `catch` statusExceptionHandler  
    L.writeFile "my.png" imgData

statusExceptionHandler ::  t -> IO L.ByteString
statusExceptionHandler e = (putStrLn "oops") >> (return L.empty)
Run Code Online (Sandbox Code Playgroud)

我的"oops"消息从不打印,而是应用程序崩溃:

StatusCodeException(Status {statusCode = 404,statusMessage ="Not Found"})[("Content-Type","text/html; charset = UTF-8"),("X-Content-Type-Options","nosniff "),("日期","星期五,2012年1月27日03:10:34 GMT"),("服务器","sffe"),("内容长度","964"),("X-XSS -Protection","1; mode = block")]

我究竟做错了什么?

更新:

根据Thoma的建议,我将代码更改为以下代码段,现在已经适当地处理了异常处理.

main = do
    let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"    
    imgData <- (simpleHttp badUrl) `X.catch` statusExceptionHandler  
    case imgData of x | x == L.empty -> …
Run Code Online (Sandbox Code Playgroud)

haskell http-status-code-404 http-conduit

6
推荐指数
2
解决办法
1400
查看次数

是否有适用于Haskell的简单颜色启用记录器?

我想根据日志级别,主题等更改日志消息输出到终端的颜色.

发现在Haskell中执行此操作的唯一记录器是xmonad-contrib包的一部分,但我不想依赖它,因为它相当大.

我知道Yesod会记录颜色,但对于我如何使其记录器在Yesod Web应用程序之外工作并不明显.

我查看了hslogger,它看起来与System.Log.Logger非常相似,但似乎都没有开箱即用的颜色支持.

hslogger可以通过自定义扩展LogHandlers,所以可能有人实现了一个有颜色支持?

到目前为止,Haskell的登录是否有其他选择?

编辑:

根据Don Stewart的建议,我实现了一个与hslogger和ansi-c一起使用的自定义日志处理程序,以便允许以颜色登录终端.

logging haskell yesod

6
推荐指数
1
解决办法
662
查看次数

如何在C#中使用BinaryFormatter更改反序列化的顺序?

假设我有classA,其中包含classB,两者都是[Serializable].

我假设,在反序列化中,classB将首先被反序列化.

但事实并非如此,因为我可以通过记录每个[OnDeserialized]方法被击中来确认.

现在我有以下问题:

在classA的反序列化完成后,它应该使用classB中的值进行自我设置.不幸的是,此时尚未对classB进行反序列化,因此classA设置错误.

我的问题将得到解决,如果我可以强制BinaryFormatter在classA之前反序列化classB,或者将对象图从底部到顶部而不是从上到下解析.

另一个明显的解决方案是让classB在反序列化时激活一个事件然后让classA自行设置,但我想远离这个非优雅的解决方法.

如果有人知道更好的解决方案,我将不胜感激.

.net c# serialization binaryformatter

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

如何在Prism中使用DataTemplates

我一直在使用Prism一段时间,并享受解耦我的模块更容易.

这对视图和视图模型特别有用,因为您可以通过接口注入视图模型,并通过区域管理器注入视图.

不幸的是,这只适用于我的观点是完全成熟的用户控件,除非我在这里遗漏了一些东西(我真诚地希望我是).

很多时候,我会创建一个ViewModel和一个匹配的DataTemplate.然后,其他程序集可以使用它们来组成视图.

我的问题是,在没有引用包含程序集的情况下,我看不到引用这些datatemplates的方法,所以在我的xaml文件中我写了类似的东西:

<ResourceDictionary Source="pack://application:,,/......>
Run Code Online (Sandbox Code Playgroud)

当然,这并没有真正解耦,虽然我试图确保,我没有在我的代码中的任何其他地方引用程序集.

我想到的另一个解决方案是将datatemplates放入Infrastructure项目中,但我也不太喜欢,因为我希望包含属于模块的所有东西(当然除了接口).

那么,有没有人有一个很好的解决方法,或者我是否错过了一些Prism功能?

wpf dependency-injection prism datatemplate

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

如何在F#中隐藏方法?

我目前正在F#中实现一个Spec框架,我希望在我的should类型上隐藏Equals,GetHashCode等方法,这样API就不会混杂在一起.

我知道在C#中它是通过使类实现这样的接口来完成的:

using System;
using System.ComponentModel;

public interface IFluentInterface
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    bool Equals(object other);

    [EditorBrowsable(EditorBrowsableState.Never)]
    string ToString();

    [EditorBrowsable(EditorBrowsableState.Never)]
    int GetHashCode();

    [EditorBrowsable(EditorBrowsableState.Never)]
    Type GetType();
}
Run Code Online (Sandbox Code Playgroud)

我尝试在F#中做同样的事情:

type IFluentInterface = interface

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    abstract Equals : (obj) -> bool

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    abstract ToString: unit -> string

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    abstract GetHashCode: unit -> int

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    abstract GetType : unit -> Type 
end
Run Code Online (Sandbox Code Playgroud)

在我的类型中实现它:

        interface IFluentInterface with
        member x.Equals(other) = x.Equals(other)
        member x.ToString()    = x.ToString() 
        member x.GetHashCode() = x.GetHashCode()
        member x.GetType()     = x.GetType() 
Run Code Online (Sandbox Code Playgroud)

但没有成功.

我也试图覆盖我的类型中的方法并以这种方式添加属性,但这也没有做到. …

api f#

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

检测选项卡项何时添加到WPF选项卡控件

我试图将WPF选项卡控件的选定选项卡项与已添加的最后一项同步.

由于没有这样的财产如IsSynchedWithLastAddedItem,我想的时候,为了在最后加一个点的SelectedItem加入一个项目检测.

当添加TabItem时,我找不到引发的事件 - 在选项卡控件或其Items上.

我确信它必须存在,但我希望有人可以帮助我.

c# wpf

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

如何为Haskell中的所有用户设置文件权限

我试图实现同样的目标sudo chmod 755 myfile.

我发现getPermissionssetPermissionsSystem.Directory,但只允许我为当前用户设置权限(在我的情况根).

是否存在适用于所有用户的等效功能,或者是使用rawSystem呼叫的唯一可行选项,我认为这有点不干净?

linux file-io haskell

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