我有一个TreeView绑定到一个层次结构,通过HierarchicalDataTemplate
s 包含几个不同的类.当选择树中的项目时,SelectedItemChanged
事件当然会愉快地通过父项向上冒泡,就像它应该的那样.它应该有什么不能做的,但仍然没有,正高兴地保持在起泡后,我设置e.Handled
到true
.
该事件仍将在父项上触发,其RoutedPropertyChangedEventArgs
外观与所选的父项完全相同; 甚至OriginalSource
属性也将指向父项,而不是最初选择的项.e.Handled
当然会false
.
几乎同样的问题在这里被问到,但我没有使用EventAggregator
或CAL,这里找到的解决方法没有多大帮助,因为我并不是专门针对鼠标事件.
有没有办法精确地获得实际选择的项目或强行停止冒泡的疯狂(不使用我能想到的全局变量的非常暴力和不道德的黑客)?
感谢您的任何见解.
请注意,我对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) 我们最近有几个问题出现在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
我有以下代码(在一个更大的函数内,但这不重要):
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()
为每对order
和task
值调用一次,无论多久getOrdersForTask
调用相同的task
值,因为输入序列只迭代(最多)一次.但是,情况似乎并非如此; 如果我n
为所有的值调用函数时间task
,则分析显示n * number of orders * number of tasks
调用Contains()
.
更换Seq.cache
用Seq.toList
了我的预期效果,但我想避免招致的成本Seq.toList
.
我Seq.cache
在使用它时误解或做错了什么?
我开发F#
的应用程序.net 4.6.1
上VS2015
.我有方法:
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) 我一直在开发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) 我正在研究一个相当嵌套的模型,它有一些循环引用.它还使用实体框架,因此所有列表都是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>();
将抛出强制转换异常.
使用 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(...),但即使这样也不起作用。
有人有线索吗?谢谢。
为了在后台线程上执行操作并避免阻塞 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)
Async
函数似乎都没有做类似的事情。如果没有,将上面的代码变成一个函数有意义吗?
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#编码中使用F#Power Tools.没有它,生活就不一样了.
偶尔,通常在几天或几周之后,我会丢失语法着色和其他一些功能(F12会员也停止工作).
之前我通过重新安装Power Tools修复了它,但我不知道重新安装修复它还是强制刷新VS中的某个文件.只是重新启动/重新编译等没有帮助.
在我的C++时代有一个我可以删除的浏览信息文件,这里有类似的东西吗?任何想法在哪里看?
f# ×5
.net ×2
autofixture ×2
.net-4.6.1 ×1
abstract ×1
asynchronous ×1
c# ×1
com ×1
interface ×1
moq ×1
npgsql ×1
sequence ×1
threadpool ×1
treeview ×1
vsix ×1
vspackage ×1
wpf ×1
xunit.net ×1