0

C# 文件:

public partial class MainWindow : Window
{
    public DelegateCommand<ICollection<string>> TestCommand { get; set; }

    public ICollection<string> TestParameter
    {
        get
        {
            List<string> lstParams = new List<string>() { "test", "test2", "test3" };
            return lstParams;
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        TestCommand = new DelegateCommand<ICollection<string>>(TestMethod);
    }

    private void TestMethod(ICollection<string> param)
    {
        if (param != null)
        {
            lblTest.Content = "Hit";
        }
    }
}

.XAML 文件

<Window x:Class="WPFAttachedBehaviorTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:WPFAttachedBehaviorTest"
    Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction CommandParameter="{Binding Path=TestParameter}" Command="{Binding Path=TestCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>
<Label x:Name="lblTest"></Label>
</Window>

TestParameter getter 上的断点触发,但 TestMethod 永远不会触发。

我在输出窗口中看不到任何绑定错误(相反,如果我故意拼错 TestCommand2 它会抱怨 - 所以我想这是正确的)

这是使用 Prism DelegateCommand 和 Expression Blend InvokeCommandAction 行为

4

2 回答 2

2

发现了问题......这是一个排序问题 - 我在 InitializeComponent() 之后分配了命令,导致 XAML 被处理(因此首先评估绑定表达式 - 此时 TestCommand 属性仍然为 NULL)

我的愚蠢的新手错误。

于 2012-11-06T03:33:26.363 回答
1

我自己的实现也有类似的问题ICommand,原因是在Execute()命令的方法中,它错误地尝试将参数强制转换T为逆变方式。我不知道 PrismDelegateCommand<T>长什么样,但您可能想调试它的代码以找出答案。否则,我在您的代码中看不到任何错误。

于 2012-11-06T03:03:37.297 回答