将命令绑定到ItemTemplate中的Button

时间:2013-12-24 10:36:09

标签: c# command windows-mobile xaml-binding

您好我正在尝试将命令绑定到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中不起作用。请指导我

3 个答案:

答案 0 :(得分:3)

主要是因为按钮被绑定到项目DataContext和 不是你的ViewModel DataContext你应该修改你的命令绑定 像下面这样的东西:

Command="{Binding Path=DataContext.MyViewModelCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}

x:Type应为ViewModel DataContext的父类型 设置为,可以是PageUserControl或任何容器,基本上是具有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);
    }