我有一个带网格的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" />
答案 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
的另一个实例。