3

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

4

3 回答 3

3

主要是因为按钮绑定到项目DataContext而不是您的 ViewModel DataContext 您应该将命令绑定修改为如下所示:

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

x:Type 应该是您的 ViewModelDataContext 设置为的父类型,它可以是Page一个UserControl或任何 Container,基本上是具有您的 ViewModel 的 Control DataContext

而且您的命令必须有一个参数,因为您将对项目本身采取行动,就像以下内容一样

 CommandParameter="{Binding}"

这意味着命令参数是在您的视图中单击按钮的项目,您可以在 ViewModel 中通过添加对另一个列表的引用或删除它来对它做出反应,具体取决于您想要做什么。

于 2013-12-24T18:34:41.200 回答
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);
    }
于 2013-12-25T05:45:50.827 回答
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/

希望能帮助到你。:)

于 2013-12-24T14:40:50.957 回答