列表框中的Combobox事件处理(带数据绑定)

时间:2013-11-04 23:04:21

标签: wpf wpf-controls prism

我在这方面已经结束了......所以我有一个经典的产品类别场景。产品属于一个类别。我的列表框源是产品,每个产品将再次具有类别的组合框。我的问题是,SelectionChanged似乎没有激发。所有数据都显示正常。组合框加载精细等不知道如何调试这个.. .......

    <DataTemplate x:Key="ProductDataTemplate">
        <StackPanel Orientation="vertical">
//resources here...
                <TextBlock Text="{Binding Path=ProductName}" ></TextBlock>
                <ComboBox Background="Transparent" SelectedValuePath="CategoryId" DisplayMemberPath="CategoryName" SelectedIndex="0">
                    <ComboBox.ItemsSource>
                        <CompositeCollection>
                            <models:Category CategoryName="Select" CategoryId="{x:Static sys:Guid.Empty}" Order="0"/>
                            <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=categories}}" />
                        </CompositeCollection>
                    </ComboBox.ItemsSource>  
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectionChanged">
                            <i:InvokeCommandAction Command="{Binding Path=SelectionChangedCommand}" CommandParameter="{Binding SelectedItem}"></i:InvokeCommandAction>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </ComboBox>
            </StackPanel>

我在其他地方的列表框是:

                <ListBox ItemsSource="{Binding Products}" ItemTemplate="{DynamicResource ProductDataTemplate}" Height="Auto" Margin="50,256,50,64" HorizontalAlignment="Center">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal"/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>

我的viewmodel是标准的东西:

public ICommand SetSelectionChangedCommand { get { return new RelayCommand(param => this.SetSelectionChangedExecute(param), null); } }
private void SetSelectionChangedExecute(object param)
{
    MessageBox.Show("Selected");
}

我有什么问题..当我为随机产品选择一个随机类别时,为什么不控制来到处理程序?我的RelayCommand如下:

    public class RelayCommand : ICommand
{
    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }
    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    public void Execute(object parameter)
    {
        _execute(parameter);
    }
    private readonly Action<object> _execute;
    private readonly Predicate<object> _canExecute;
}

修改 我有一种感觉我的问题是命令绑定路径不正确。怎么知道去看ViewModel?我的ViewModel被设置为祖先Grid的DataContext,它在层次结构中上升。够了吗?或者我是否必须在命令绑定中正确限定路径?:

                    <i:InvokeCommandAction Command="{Binding Path=SelectionChangedCommand}" CommandParameter="{Binding SelectedItem}"></i:InvokeCommandAction>

我需要做些什么来确保在我的ViewModel中搜索Command?

2 个答案:

答案 0 :(得分:1)

在审核您向我们展示的代码实现时,似乎发现了一个不一致的地方:

Product DataTemplate 实施中的 SelectionChanged事件触发器 中,您将命令绑定到 SelectionChangedCommand

但是,我在 ViewModel 中看到, SelectionChanged命令被声明为 SetSelectionChangedCommand 。您在ViewModel的命令定义中添加了 'Set' 前缀。

考虑到如果找不到路径引用, Binding 不会抛出任何异常。相反,它可以作为触发不存在的命令而无效,应用程序将继续运行而不会发出任何警告。

我希望这会有所帮助。

答案 1 :(得分:0)

问题是,我们需要在命令绑定中正确指定路径:

                        <i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid, AncestorLevel=1}}" CommandParameter="{Binding SelectedItem}"></i:InvokeCommandAction>