ICommand无法在Silverlight用户控件中工作

时间:2016-06-01 07:58:35

标签: wpf silverlight mvvm

我有一个带网格的UserControlBase。网格包含一个带有Action的列。

<sdk:DataGridTemplateColumn Header="Action">
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel>
                 <Button Style="{StaticResource DataGridButton}"  Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" Content="Modify" />
             </StackPanel>
         </DataTemplate>
     </sdk:DataGridTemplateColumn.CellTemplate>
 </sdk:DataGridTemplateColumn>

我的问题出在我的Command上。这是我的技术错误,这是我的第一个问题,我不知道如何使这个应用程序给我真正的错误信息。

在我的用户控件后面的代码中,我注册了事件:

protected void RegisterMessages()
{
    Messenger.Default.Register<string>(this, "NewNewsBtn_Click", NewNewsBtn_Click);
    Messenger.Default.Register<string>(this, "ModifyNewsBtn_Click", ModifyNewsBtn_Click);
}

在我的构造函数中:

public NewsWindow(int underlyingId)
{
    InitializeComponent();
    this.RegisterMessages();
    viewModel = new NewsViewModel(underlyingId);
    ucNewsPanel.DataContext = viewModel;
}

我的视图模型(NewsViewModel)

public ICommand ModifyNewsCommand
{
    get
    {
        return new RelayCommand<string>(e =>
        {
            Messenger.Default.Send(string.Empty, "ModifyNewsBtn_Click");
        });
    }
}

这里奇怪的是我的NewNewsBtn正在运作,而ModifyNewsBtn却没有。

此按钮位于网格外部,因此可能会对其工作原因产生影响。

<Button x:Name="NewNewsBtn" MaxHeight="50" MaxWidth="100" Command="{Binding Path=NewNewsCommand}" Content="Add New" />

2 个答案:

答案 0 :(得分:1)

您的DataGrid将绑定到某个集合,每个项目都有一行。现在该项是行的DataContext。您需要做的是将您的&#34;修改&#34; - 按钮绑定到父DataContext。如果您使用的是silverlight5,则可以使用AncestorBinding

<Button
    Content="Modify"
    Command="{Binding
        Path=DataContext.ModifyNewsCommand,
        RelativeSource={RelativeSource AncestorType=UserControl}}"/>

答案 1 :(得分:0)

您的语法看起来没问题:

<Button Style="{StaticResource DataGridButton}" Content="Modify" 
  Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}"/>

但您在代码中设置了viewModel。我是否正确您在XAML中创建StaticResource?如果是,则只需从代码隐藏中删除设置DataContext,导致以下行Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}"将在viewModel的另一个实例中看到。 (因为您创建了NewsViewModel作为StaticResource和代码隐藏的两个实例

<强>更新
我在代码后面需要DataContext,因为我将参数传递给我的视图模型。如果我从后面的代码中删除它,我能以任何方式做到这一点吗?
然后,您应该从StaticResource

的绑定中删除Command
<Button Style="{StaticResource DataGridButton}" Command="{Binding ModifyNewsCommand}" 
                                                                    Content="Modify"/>

因为您正在引用NewsViewModel的另一个实例。