小编bja*_*vor的帖子

从StaticResource设置RowDefinition高度

在我的WPF样式中,我已经定义了一个标准网格行高度,我想应用于几个地方,如下所示:

<system:Double x:Key="TableRowHeight">22</system:Double>
Run Code Online (Sandbox Code Playgroud)

但是,当我想这样应用时,它不起作用:

<RowDefinition Height="{StaticResource TableRowHeight}"/>
Run Code Online (Sandbox Code Playgroud)

相反,我需要创建一个完整的风格,如:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
    <!--<Setter Property="Height" Value="{StaticResource TableRowHeight}"/>-->
    <Setter Property="Height" Value="22"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

从注释掉的行中可以看出,尝试引用Style定义中的数字常量也不起作用,但"硬编码"值也可以.

现在我查了一下,我想这是因为与Height属性相关联的类型是GridLength,并且它在某种程度上无法在从另一个资源传入时自动转换double值...

问题是似乎没有办法从XAML创建GridLength对象.价值属于只读.所以像这样的东西也不起作用:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
    <Setter Property="Height">
        <Setter.Value>
            <GridLength Value="{StaticResource TableRowHeight}"/>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

有没有办法让它工作,或者我应该忘记使用该常量,只使用带有硬编码值的RowDefinition样式代替常量?

c# wpf

21
推荐指数
1
解决办法
9104
查看次数

跨多个应用程序层管理大量枚举

我有一个应用程序,需要使用许多不同的枚举.该应用程序可以分为多个层.为了示例,我们假设有三个层:第三方分析库,应用程序业务逻辑和UI /表示逻辑.

在许多情况下,所有层都可能需要表示相同概念的枚举.我们以付款频率为例.(例如年度,半年度,季度等......).第三方库提供了自己的枚举,业务逻辑层中的各个类需要类似的枚举,最后UI层可能需要它来呈现下拉列表中的各种选择等...

现在,通常我想通过不从层的公共接口中暴露内部依赖的类型来保护每个层的用户免受其内部依赖性和实现细节的影响.这意味着即使与第三方lib的交互需要使用自己的"频率"枚举,我还需要为业务层创建一个等效的"频率"枚举,并且可能需要为UI层创建另一个枚举...

所有这些都需要来回进行大量的映射,并且需要大量额外的映射器类.另一方面,冒险是每个层可能决定排除它不需要的值或从其自己的枚举版本支持...

既然我必须处理很多枚举,我只是想知道这通常是一件好事,还是我只是过于复杂化了?

c# enums

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

C# 基于简单值的 DTO 比较(以及 GetHashCode 困境)

我知道已经有很多关于 GetHashCode 的讨论,但是他们通常提供的建议对于解决应该是一个相对简单的问题并不是很有帮助......

我有一个简单的 DTO 类,其中包含许多自动实现的各种类型的属性,我想对此类的两个实例执行简单的基于值的比较。(主要目的是确定在不同时间点生成的实例之间发生的任何变化。)

这可以通过添加适当的方法很容易地完成。但碰巧的是,这正是 Equals() 方法和 IEquatable 接口的用途。所以我认为,与其仅仅实现一个非标准的自定义方法,不如实现 IEquatable...

现在问题来了:MSDN 文档说为了实现 IEquatable,您还应该覆盖 Object.Equals()。这是有道理的。但是如果你覆盖 Object.Equals() 你也应该覆盖 HetHashCode()。仍然不是一个真正的问题,我在这里找到了关于如何计算它的各种讨论,如果你决定的话。

然而,我读过的文档和所有讨论都说 GetHashCode() 输出应该保持稳定,因此不建议在可变对象上覆盖它......我可以理解这一点。(不过,让我注意,我无意将此类用作字典键,这似乎是主要问题...)

但是,我拥有的 DTO 类是可变的。使其不可变将需要使用笨拙的构造函数或带有大量参数或构建器模式的静态工厂方法,并且会阻止您使用相当方便的对象初始值设定项语法。总而言之,这真的不值得付出努力和带来不便。

所以现在怎么办?我仍然想添加一种比较内容的方法,但现在我不太确定推荐的最佳实践是什么。

编辑:

忘了补充,我还看到了基于您班级中的一组不可变字段实现 GetHashCode 的建议。但是,由于我的所有属性都是自动实现和可设置的,因此从技术上讲,它们都可以更改...

更新:

感谢您的回答。所以基本上我不需要太担心 GetHashCode,只要“我知道我在做什么”——这意味着该类不会在键控集合中使用。

也感谢关于 IEqualityComparer 的建议,我可能会试一试。

选择“接受”的答案有点困难,因为它们都是很好的答案,但我必须选择一个......

c#

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

在接收端使用基于lambda的签入INotifyPropertyChanged

关于如何使用lambda表达式来引发INotifyPropertyChanged事件以重构自由代码,有大量代码和示例.这通常用作:

NotifyOfPropertyChanged(() => PropertyName);
Run Code Online (Sandbox Code Playgroud)

我的问题是,你如何在事物的接收端实现类似的东西,在那里你通常会有一些类型的switch语句:

private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case "XYZ":
            break;
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在以某种方式避免在这里使用字符串会很好,以便在更改属性名称时不会破坏...

作为目前的中途解决方案,我只使用具有公共常量的嵌入式类,例如:

public class MyClass
{
    public static class Notifications
    {
        public const string Property1 = "Property1"
        //...
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后在接收端:

private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case MyClass.Notifictions.Property1:
            break;
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

这比纯字符串要好一些,因为它们只需要在一个地方维护,并且在同一个类中,你也可以对属性名称进行任何更改,但仍然不是一个非常令人满意的解决方案......

有人知道更好的方法吗?

c# lambda inotifypropertychanged

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

标签 统计

c# ×4

enums ×1

inotifypropertychanged ×1

lambda ×1

wpf ×1