小编Tea*_*Dev的帖子

处理TreeView.SelectedItemChanged事件仍然是气泡

我有一个TreeView绑定到一个层次结构,通过HierarchicalDataTemplates 包含几个不同的类.当选择树中的项目时,SelectedItemChanged事件当然会愉快地通过父项向上冒泡,就像它应该的那样.它应该有什么不能做的,但仍然没有,正高兴地保持在起泡后,我设置e.Handledtrue.

该事件仍将在父项上触发,其RoutedPropertyChangedEventArgs外观与所选的父项完全相同; 甚至OriginalSource属性也将指向父项,而不是最初选择的项.e.Handled当然会false.

几乎同样的问题在这里被问到,但我没有使用EventAggregator或CAL,这里找到的解决方法没有多大帮助,因为我并不是专门针对鼠标事件.

有没有办法精确地获得实际选择的项目或强行停止冒泡的疯狂(不使用我能想到的全局变量的非常暴力和不道德的黑客)?

感谢您的任何见解.

.net com wpf treeview event-bubbling

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

AutoMoqCustomization是否适用于抽象类?

请注意,我对TDD有些新意,所以我会提出一般性的建议以及具体的答案.

抽象类和接口都不能实例化.显然,Moq可以在第二次测试中给我一个模拟的ADataFeed实例.为什么AutoMoqCustomization适用于接口IDataFeed而不适用于抽象类ADataFeed,而是抛出InvalidOperationException?

其次,AutoFixture方法(或者通常是TDD)可以驱动一个设计,该设计可能需要一个带有构造函数的抽象类来要求并保证某些值,例如在这种情况下的连接字符串?

[Theory, AutoMoqData]
public void AllDataFeedsHaveAConectionString(
    IDataFeed sut)
{
    var result = sut.GetConnectionString();
    Assert.Null(result);
}

[Fact]
public void AllDataFeedsRequireAConnectionString()
{
    var expected = Guid.NewGuid().ToString();
    var sut = new Mock<ADataFeed>(expected);
    var result = sut.Object.GetConnectionString();
    Assert.Equal(expected, result);
}

[Theory, AutoMoqData]
public void AllDataFeedsRequireAConnectionString2(
    [Frozen] string expected, 
    ADataFeed sut)
{
    var result = sut.GetConnectionString();
    Assert.Equal(expected, result);
}
Run Code Online (Sandbox Code Playgroud)

interface moq xunit.net abstract autofixture

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

CRM 2011插件中的线程/环境上下文

我们最近有几个问题出现在Dynamics CRM 2011中,一个插件执行(即Execute()方法的传递)保证保持在同一个线程上.

我想使用Ambient Context模式实现跟踪,以避免将跟踪服务传递给任何可能要跟踪的类.问题在于,正如我们所知,插件仅在每个注册步骤中实例化一次,然后从同一实例提供所有后续操作; 这意味着我不能只有一些静态属性,比如Tracing.Current我分配当前ITracingService实例,我很高兴.如果我这样做,最后启动的操作将覆盖可能仍在运行的所有其他操作的实例(并且这种并发并不罕见).

现在,如果我可以确定该Execute()方法下的所有内容都保留在同一个线程中,我仍然可以使用环境上下文利用[ThreadStatic]静态字段的属性:

public static class Tracing
{
    [ThreadStatic]
    private static ITracingService _current;

    public static ITracingService Current
    {
        get
        {
            if (null == _current)
            {
                _current = new NullTracingService();
            }

            return _current;
        }

        set { _current = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我会在输入Execute()方法时设置它并在最后清除它,以便删除对跟踪服务实例的引用.

我唯一可以在MSCRM插件的上下文找到线程的方法是,显然单个线程来自ThreadPool - 无论对我的问题可能产生什么后果.

有没有人更深入地了解如何使用MSCRM插件处理线程 - 或者在这种特殊情况下如何使用SOLID代码优雅地处理跟踪问题的任何其他想法(AOP /动态拦截在这里没有选项)?

感谢您的帮助和指点.

c# multithreading cross-cutting-concerns threadpool dynamics-crm-2011

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

(Mis)了解Seq.cache

我有以下代码(在一个更大的函数内,但这不重要):

let ordersForTask = Dictionary<_, _>()

let getOrdersForTask task =
    match ordersForTask.TryGetValue task with
    | true, orders -> orders
    | false, _ ->
        let orders =
            scenario.Orders
            |> Seq.filter (fun (order : Order) -> order.Tasks.Contains(task))
            |> Seq.cache

        ordersForTask.Add(task, orders)
        orders
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这应该导致order.Tasks.Contains()为每对ordertask值调用一次,无论多久getOrdersForTask调用相同的task值,因为输入序列只迭代(最多)一次.但是,情况似乎并非如此; 如果我n为所有的值调用函数时间task,则分析显示n * number of orders * number of tasks调用Contains().

更换Seq.cacheSeq.toList了我的预期效果,但我想避免招致的成本Seq.toList.

Seq.cache在使用它时误解或做错了什么?

f# sequence

6
推荐指数
0
解决办法
742
查看次数

F#方法返回null而不是Option

我开发F#的应用程序.net 4.6.1VS2015.我有方法:

type CommonHelper = 
    static member SideEffectOnNull act x = if x = null then act(); x else x
    static member SideEffectOnNotNull act x = if x <> null then act(); x else x
Run Code Online (Sandbox Code Playgroud)

...

    static member GetPerformanceCounter ( fname: CounterFullName ) = 

        let getCounterInternal ( counterFullName: CounterFullName ) =
            Log.Information("Getting counter: {category}\\{name}\\{instance} ",  counterFullName.Category, counterFullName.Name, counterFullName.Instance)
            let receivedCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault( fun x -> String.Equals( x.CategoryName, counterFullName.Category.Category, StringComparison.InvariantCultureIgnoreCase ) )
            if receivedCategory = …
Run Code Online (Sandbox Code Playgroud)

.net f# .net-4.6.1

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

VSPackage:在运行时修改工具栏按钮文本/工具提示

我一直在开发Visual Studio扩展作为VS2008 / 2010的加载项。现在,新版本只能作为VS2010的VSIX软件包来完成(因为它无论如何都必须是.NET 4),而且我在UI处理方面遇到了一些麻烦(我认为很简单)。

该扩展程序主要由一个工具栏组成,该工具栏包含一些用于启动各种操作,表单等的按钮,以及一些仅用作显示某些状态信息的标签。“标签”按钮本身仅显示非常简短的信息,而工具提示提供了更多详细信息。

尽管我并不认为整个Add-in东西很优雅,但是进行这种事情非常简单(尽管我的方法可能有点业余)。在将命令添加到工具栏时,我将“标签”按钮“保存”在特定的局部变量中,以便以后可以随意设置标题和工具提示文本。

在VSPackage中,等效于Microsoft.VisualStudio.CommandBars.CommandBarButton似乎是OleMenuCommand。通过MenuCommandService查找“ label”命令没有问题,但是可以根据需要进行修改。

为了找出执行此操作的目的,我只有一个工具栏,该工具栏中有两个按钮。btnAction非常简单;只是一个图标和一个执行处理程序来更改另一个按钮上的文本,没有CommandFlags。 btnLabel.vsct中看起来像这样:

<Button guid="guidVSPackageBuilderTutorialCommandSet" id="btnLabel" priority="0x0100">
    <CommandFlag>DefaultDisabled</CommandFlag>
    <CommandFlag>DontCache</CommandFlag>
    <CommandFlag>NoCustomize</CommandFlag>
    <CommandFlag>TextChanges</CommandFlag>
    <CommandFlag>TextOnly</CommandFlag>
    <Strings>
        <CommandName>cmdidbtnLabel</CommandName>
        <ButtonText>btnLabel</ButtonText>
        <MenuText>btnLabel</MenuText>
        <ToolTipText>Tooltip btnLabel</ToolTipText>
    </Strings>
</Button>
Run Code Online (Sandbox Code Playgroud)

这样做的第一个问题是,当我使用TextChanges时,将忽略ToolTipText字符串,并且最初也将ButtonText用作工具提示。

动作按钮的处理程序代码如下:

private int iClickCount = 0;

protected override void btnActionExecuteHandler(object sender, EventArgs e)
{
    var svc = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;

    CommandID idBtnLabel = new CommandID(GuidList.guidVSPackageBuilderTutorialCmdSet, (int)PkgCmdIDList.btnLabel);
    var cmd = svc.FindCommand(idBtnLabel) as OleMenuCommand;

    cmd.Text = …
Run Code Online (Sandbox Code Playgroud)

visual-studio-2010 vspackage visual-studio vsix

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

我怎样才能找出为什么AutoFixture抛出Kernel.OmitSpecimen异常

我正在研究一个相当嵌套的模型,它有一些循环引用.它还使用实体框架,因此所有列表都是ICollection<T>.为了适应这种情况,我正在配置AutoFixture,如下所示:

_fixture = new Fixture().Customize(new MultipleCustomization());
_fixture.Behaviors.Remove(new ThrowingRecursionBehavior());
_fixture.Behaviors.Add(new OmitOnRecursionBehavior());
Run Code Online (Sandbox Code Playgroud)

当我尝试创建一个类型

_fixture.CreateAnonymous<Session>();
Run Code Online (Sandbox Code Playgroud)

AutoFixture有问题,并引发以下错误

System.InvalidCastException:无法将类型为'Ploeh.AutoFixture.Kernel.OmitSpecimen'的对象强制转换为'The.Model.Language'

如果我在Session类型中排除集合Language,则AutoFixture会为图中的其他类型抛出相同的异常.

有没有办法从AutoFixture中提取更多信息,例如导致错误的属性?

为什么AutoFixture试图将我的类型转换为OmitSpecimen以及在此过程中可能发生什么以防止它被强制转换?

我在这里为堆栈跟踪创建了一个要点.

更新

我设法重现了这个问题.鉴于这对对象

public class Session
{
    public Language Language { get; set; }
}

public class Language
{
    public ICollection<Session> Sessions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

调用_fixture.CreateAnonymous<Session>();将抛出强制转换异常.

autofixture

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

从 F# 访问显式转换运算符

使用 npgsql 从 postgresql 读取日期值时出现以下错误:

This expression was expected to have type
    DateTime    
but here has type
    NpgsqlTypes.NpgsqlDate  
Run Code Online (Sandbox Code Playgroud)

现在 npgsql 文档引用了正在定义的显式运算符:

[C#]
public static explicit operator DateTime(
    NpgsqlDate date
);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从 F# 访问它。

有几种笨拙的、简单的方法可以实现我所需要的,但我感到失望和沮丧,因为我无法找到访问内置演员的方法。

我尝试了旧的 Convert.ToDateTime(...),但即使这样也不起作用。

有人有线索吗?谢谢。

f# npgsql

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

使用异步工作流的 WPF 后台操作

为了在后台线程上执行操作并避免阻塞 WPF 应用程序中的 UI,我经常发现自己编写了以下模式:

async {
    // some code on the UI thread

    let uiThread = SynchronizationContext.Current
    do! Async.SwitchToThreadPool()

    let! result = // some Async<'t>

    do! Async.SwitchToContext uiThread

    // do things with the result if it wasn't () all along
}
Run Code Online (Sandbox Code Playgroud)
  1. 我这样做完全正确吗?这是惯用语吗?应该采取不同的做法吗?
  2. 如果这是正确的,我当然不想一直这样做——是否有一种内置的更短的方法来实现同样的事情?现有的Async函数似乎都没有做类似的事情。
  3. 如果没有,将上面的代码变成一个函数有意义吗?

    let onThreadPool operation =
        async {
            let context = SynchronizationContext.Current
            do! Async.SwitchToThreadPool()
    
            let! result = operation
    
            do! Async.SwitchToContext context
    
            return result
        }
    
    Run Code Online (Sandbox Code Playgroud)

这增加了另一个层次的async { }嵌套——这会在“某个”点引起问题吗?

f# asynchronous

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

使用F#Power Tools丢失语法着色,重新安装有助于寻找更简单的解决方案

我不得不承认,我已经习惯于在我的日常F#编码中使用F#Power Tools.没有它,生活就不一样了.

偶尔,通常在几天或几周之后,我会丢失语法着色和其他一些功能(F12会员也停止工作).

之前我通过重新安装Power Tools修复了它,但我不知道重新安装修复它还是强制刷新VS中的某个文件.只是重新启动/重新编译等没有帮助.

在我的C++时代有一个我可以删除的浏览信息文件,这里有类似的东西吗?任何想法在哪里看?

f# visual-studio-2015

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