您好我正在尝试将命令绑定到LongListSelector的ItemTemplate内的按钮。但面临绑定问题。这是我的代码 -
XAML
<DataTemplate x:Key="ItemTemplate">
<StackPanel Height="108" Width="308" Margin="6,6">
<TextBlock Text="{Binding Name}" Foreground="red"></TextBlock>
<TextBlock Text="{Binding Type}" Foreground="red"></TextBlock>
<Button Content="add to emergency" Foreground="White" Background="red" Command="{Binding Path=DataContext.MyViewModelCommand}"/>
</StackPanel>
</DataTemplate>
命令
public class ActionCommand : ICommand
{
private readonly Action _action;
public ActionCommand(Action action)
{
_action = action;
}
public void Execute(object parameter)
{
_action();
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
}
视图模型
public class HspitalVM:INotifyPropertyChanged
{
public HspitalVM()
{
MyViewModelCommand = new ActionCommand(DoSomething);
}
public ICommand MyViewModelCommand { get; private set; }
private void DoSomething()
{
}
}
该命令适用于裸按钮,但在ItemTemplate中不起作用。请指导我
答案 0 :(得分:3)
主要是因为按钮被绑定到项目DataContext
和
不是你的ViewModel DataContext你应该修改你的命令绑定
像下面这样的东西:
Command="{Binding Path=DataContext.MyViewModelCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}
x:Type应为ViewModel DataContext
的父类型
设置为,可以是Page
或UserControl
或任何容器,基本上是具有ViewModel DataContext
的控件。
你的命令必须有一个参数,因为你将采取行动 项目本身,就像下面的
CommandParameter="{Binding}"
这意味着命令paramer是在View中单击按钮的项目,您可以在ViewModel中对其进行响应,方法是将其引用添加到另一个List或删除它,具体取决于您要执行的操作。
答案 1 :(得分:0)
对于Windows Phone,最好的解决方案是使用mvvmlight工具包并使用viewmodellocator类作为源并通过它绑定正确的命令,在这种情况下,您可以根据需要使用事件来命令行为。
您可以查看http://msdn.microsoft.com/en-us/magazine/dn237302.aspx了解详情。
如果您不想使用mvvmlight工具包,可以查看此博客,其中显示了将RelativeSource绑定与FindAncestor模式绑定的方法。
http://blog.thekieners.com/2010/09/08/relativesource-binding-with-findancestor-mode-in-silverlight/
希望它有所帮助。 :)
答案 2 :(得分:0)
最后回答
XAML(针对该页面)
<phone:PhoneApplicationPage
DataContext="{Binding HspitalVM, Source={StaticResource Locator}}" >
XAML(对照)
<Button x:Name="button" Content="add to emergency" Foreground="White" Background="#FFF7203C" Command="{Binding HspitalVM.GiveDetails, Mode=OneWay}" DataContext="{Binding Source={StaticResource Locator}}" CommandParameter="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"/>
<强>视图模型强>
public RelayCommand<object> GiveDetails { get; private set; }
public HspitalVM()
{
hspitalList=ReadToObject();
GiveDetails = new RelayCommand<object>(DoSomething);
}
private void DoSomething(object param)
{
var fetchedCountry = (Hspital)param;
MessageBox.Show("The country name is " + fetchedCountry.Name);
}