如何在silverlight4中调用listbox中的命令

时间:2012-11-08 09:26:01

标签: xaml data-binding silverlight-4.0

我正在使用Listbox并且它包含按钮,我想使用command来处理按钮单击事件。但我的命令从不调用。

这是正确的方法??

  <pmControls:pmListBox Grid.Row="1" Margin="3" ItemsSource="{Binding Countries}" SelectedItem="{Binding SelectedCountry}" >
                <pmControls:pmListBox.ItemTemplate >
                    <DataTemplate >
                        <Button Command="{Binding GetAllStatesCommand}"   CommandParameter="{Binding}" Margin="3" Width="100" Height="50" Content="{Binding Title}">                                                                                                                                
                        </Button>

                    </DataTemplate>
                </pmControls:pmListBox.ItemTemplate>
  </pmControls:pmListBox>

1 个答案:

答案 0 :(得分:0)

一个列表项的DataContext与周围控件的DataContext不同。要将该命令绑定到该控件的DataContext,您有两个选择:

您可以为控件提供名称和对它的引用:

<pmControls:pmListBox x:Name="myCoolListBox" [...]>
    <pmControls:pmListBox.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding DataContext.GetAllStatesCommand, ElementName=myCoolListBox}" CommandParameter="{Binding}" [...] />                                           
        </DataTemplate>
    </pmControls:pmListBox.ItemTemplate>
</pmControls:pmListBox>

或者您创建了一个包含DataContext ...

的班级
public class DataContextBinder : DependencyObject
{
    public static readonly DependencyProperty ContextProperty = DependencyProperty.Register("Context", typeof(object), typeof(DataContextBinder), new PropertyMetadata(null));
    public object Context
    {
        get { return GetValue(ContextProperty); }
        set { SetValue(ContextProperty, value); }
    }
}

...并在ListBox的资源部分创建一个实例:

<pmControls:pmListBox x:Name="myCoolListBox" [...]>
    <pmControls:pmListBox.Resources>
        <local:DataContextBinder x:Key="dataContextBinder" Context="{Binding}" />
    </pmControls:pmListBox.Resources>
    <pmControls:pmListBox.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding Context.GetAllStatesCommand, Source={StaticResource dataContextBinder}" CommandParameter="{Binding}" [...] />                                           
        </DataTemplate>
    </pmControls:pmListBox.ItemTemplate>
</pmControls:pmListBox>