小编G.Y*_*G.Y的帖子

MVC中的动态模型(非类)元数据提供程序

我们正在开发一个最终用户架构是动态的应用程序(我们有一个很好的商业案例 - 它不是静态模型可以轻松处理的东西).

我已经使用.NET DynamicObject类来允许从代码中轻松地处理这些动态模式对象,并期望这只能使用MVC模型元数据.然而,MVC元数据支持似乎受到了限制,因为它只处理每种类型定义的元数据 - 而不是每个对象,这将是这里的情况.

即使我挖掘并尝试实现我们自己的ModelMetadataProvider,似乎根本没有传入必要的信息 - GetMetadataForProperty方法特别成问题.实际上,我需要访问属性的父对象或容器对象,但传入的所有内容都是类型.

上面的内容主要来自ModelMetadata类中的FromStringExpression方法.这种方法实际上有容器(至少在这种情况下),但不通过它.当它在ViewData中找到有关存储(缓存?)的表达式的视图数据时,将执行此分支.如果失败,它会回退到通过ModelMetadata对象查找它 - 具有讽刺意味的可能对我有用.特别令人恼火的是FromStringExpression方法是静态的,所以我不能轻易地覆盖它的行为.

绝望中我曾考虑过试图遍历modelAccessor表达式,但这看起来像是一个充其量只是非常脆弱的kludge.

我已经广泛搜索了解决方案.许多人指出Brad Wilson 在非类模型上的谈话(http://channel9.msdn.com/Series/mvcConf/mvcConf-2011-Brad-Wilson-Advanced-MVC-3),但是如果你看一下实际的代码,你会看到TOO被绑定到TYPE而不是对象 - 换句话说,它不是非常有用.其他人已经指出http://fluentvalidation.codeplex.com/,但这似乎只适用于验证方面,我怀疑遇到了同样的问题(绑定到类型而不是对象)如上所述.

例如,我可能有一个包含一系列字段对象的字典对象.这看起来像(非常简化/简化示例):

public class Entity : DynamicObject, ICustomTypeDescriptor
{
    public Guid ID { get; set; }
    public Dictionary<string, EntityProp> Props { get; set; }

    ... DynamicObject and ICustomTypeDescriptor implementation to expose Props as dynamic properties against this Entity ...
}

public class EntityProp
{
    public string Name { get; set; }
    public object Value { get; set; } …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc

19
推荐指数
1
解决办法
2304
查看次数

WPF自定义控件构造,触发器和事件

WPF自定义控件

我想构建一个新的自定义控件.我发现很少的教程给了我一些如何实现这一目标的线索.据我了解,创建一个新的自定义控件总是通过扩展当前控件来完成,甚至可以从层次结构的最基本级别扩展控件,例如,您甚至可以扩展:

  • 的UIElement
  • FrameworkElement的
  • 控制
  • ContentControl中
  • HeaderedContentControl
  • ItemsControl的
  • 选择
  • RangeBase

如以下教程中所述:http://wpftutorial.net/HowToCreateACustomControl.html

所以,我按照教程创建了一个自定义控件库类型的新项目,得到了我的通用.xaml和我的代码.到现在为止还挺好.

我可以区分3种类型或类别的事件.

  1. 可以使用我的控件的窗口(或容器)可以使用的事件:那些是我想要暴露给外部的事件.怎么写那些?

  2. 与控制本身相关但不暴露在外的事件; 例如,如果鼠标超出我的控制范围,我想对此做出反应.我可以在XAML中做到这一点:

    <ControlTemplate.Triggers>
      <Trigger Property="IsMouseOver" Value="true">  
        <Setter Property="Fill" TargetName="LeftTraingularIndicator">  
          <Setter.Value>  
            <SolidColorBrush Color="Yellow" />  
          </Setter.Value>  
        </Setter>
      </Trigger>
    </ControlTemplate.Triggers>  
    
    Run Code Online (Sandbox Code Playgroud)

假设我在我的ControlTemplate中有一个带有fill属性的元素,名为x:name ="LeftTraingularIndicator"

问题:

现在我想在我的XAML中对IsMouseDown做出反应.我怎么做?没有"IsMouseDown"触发器.此外,如果我想对后面的代码做出反应,该怎么办?如果我想从后面的代码中更改LeftTraingularIndicator"Fill",还有什么呢?

  1. 与子元素相关的事件是我的ControlTemplate视觉构造的一部分,例如,如果我想对XAML中的"LeftTraigularIndicator"的"IsMouseOver"做出反应,甚至在Code Behind中做出反应?也许两者都有.

我现在正在尝试2天......感觉我在理解事情如何运作时遗漏了一些东西.没有找到任何深入解释这些问题的教程.

我希望看到我在这里提出的每个问题的几行例子.

谢谢.

.net c# wpf custom-controls wpf-controls

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

是否有可能设计一个C#类,通过反射查询它会将自己标记为正IsValueType和正IsClass?

是否有可能设计一个C#类,通过反射查询它会将自己标记为正IsValueType和正IsClass?

或者它们实际上是相互排斥的标记?

我知道,

大多数原始类型将返回(包括枚举和结构):
IsValueType = true,IsClass = false.

字符串或任何类 - 摘要也是.. return:
IsValueType = false,IsClass = true.

接口返回:
IsValueType = false,IsClass = false

.net c# reflection

9
推荐指数
1
解决办法
185
查看次数

标签 统计

c# ×3

.net ×2

asp.net-mvc ×1

custom-controls ×1

reflection ×1

wpf ×1

wpf-controls ×1