小编aov*_*ven的帖子

是否可以让CommandManager重新查询特定的WPF命令而不是全部?

我正在尝试为我的MVVM应用程序实现高度响应的UI,因此我选择让所有命令处理程序自动执行,BackgroundWorker以便它们不会阻止UI.

但与此同时,我不希望用户在后台执行时仍能执行相同的命令.解决方案似乎很明显:

  1. Executed调用处理程序,有CanExecute处理程序返回false
  2. 启动BackgroundWorker异步
  3. BackgroundWorker完成后,有CanExecute处理程序返回true一次.

问题是,我需要在步骤1之后通知WPF,然后在步骤3之后再次通知WPF CanExecute,并且应该是必需的.我知道我可以通过调用来完成它CommandManager.InvalidateRequerySuggested,但这会导致CanExecute所有其他命令的处理程序被重新查询.有很多命令,这不好.

有没有办法要求重新查询特定命令 - 即当前正在执行的命令?

TIA

wpf user-interface routed-commands mvvm

3
推荐指数
1
解决办法
1615
查看次数

比较两个值是否相等的最高效的方法是什么?

假设我在C#中有一个接受两个T类型值的泛型方法:

public void M<T>(T a, T b)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

在M()的内部体系中,我希望比较两个输入值是否相等.由于我对它们的运行时类型一无所知,除了它们是相同的类型,我可以使用object.Equals()静态方法做到这一点,并让它选择最佳方式:

public void M<T>(T a, T b)
{
    if (object.Equals(a, b))
    {
        ...
    }
    else
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当T不是引用类型时,我在这里看到的问题是不必要的两个值的装箱.我想避免这种惩罚,因为M()被频繁调用.

我的问题是:有没有更好的方法来解决这个问题?我显然对一个解决方案感兴趣,这个解决方案不会过多地分析前面的T,这将抵消拳击规避的收益.

TIA.

.net c# generics boxing

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

一个聪明的技巧,防止在没有等待的C#using子句中使用Task <IDisposable>

我有许多方法,目前返回等待Task<IDisposable>.

有没有办法更改返回类型,以便以下将成为编译时错误?

using (GetExclusiveLockAsync())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的想法是让编译器提醒我,我应该像这样编写它:

using (await GetExclusiveLockAsync())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

实际上,GetExclusiveLockAsync返回Task<IDisposable>也实现了IDisposable(通过基本Task类).两个片段都编译,但其中一个是错误的.我不想处理任务,只有它的结果!

是否有一个聪明的技巧使第一个编译时错误?

更新:根据目前的评论,似乎所展示的模式令人困惑.我现在已经将方法的名称从原始GetAsync更改GetExclusiveLockAsync为更好地说明实际的预期用途.它基本上是一个异步同步锁,这是我不需要using在行中声明变量也不需要在后面的块中使用它的主要原因.它仅用于保护它所包围的代码块免受并行影响.

c# async-await

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

如何在XAML中设置项目的高度,以便它们在父ItemsControl中始终占用相同比例的可用空间?

我有一个带有以下ItemTemplate的ItemsControl:

<DataTemplate x:Key="myItemTemplate">
    <TextBlock Height="???" Text="{Binding Path=Description}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何在模板中设置TextBlock的高度,以便自动假定ItemsControl.Height div ItemsCount垂直空间量?

当只有一个项目时,我希望它是容器的整个高度,当有两个时,每个应该是一半大小,依此类推.

如果可能的话,我宁愿在XAML中完全这样做,以保持我的ViewModel清除UI逻辑.

wpf xaml itemscontrol

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