【问题标题】:Silverlight: How to trigger a click event of a button inside a datagrid and pass a parameter to the event using relay command?Silverlight:如何触发数据网格内按钮的单击事件并使用中继命令将参数传递给事件?
【发布时间】:2011-04-11 05:00:43
【问题描述】:

这是我的 xaml 和视图模型代码:

 <sdk:DataGrid ItemsSource="{Binding Path=CurrentUserRoles, Mode=TwoWay}" AutoGenerateColumns="False">
                                                <sdk:DataGrid.Columns>
                                                    <sdk:DataGridTemplateColumn Width="80">
                                                        <sdk:DataGridTemplateColumn.CellTemplate>
                                                            <DataTemplate>
                                                                <Button Command="{Binding Path=UsersViewModel.RemoveFromUserRolesCommand}"  Content="Delete" ></Button>
                                                                <!--<Button  Content="Delete" >
                                                                    <i:Interaction.Triggers>
                                                                        <i:EventTrigger EventName="Click">
                                                                            <cmd:EventToCommand Command="{Binding Path=UsersViewModel.RemoveFromUserRolesCommand}"  
                                                                                           CommandParameter="{Binding}" PassEventArgsToCommand="True" 
                                                                        />
                                                                        </i:EventTrigger>
                                                                    </i:Interaction.Triggers>
                                                                </Button>-->
                                                            </DataTemplate>
                                                        </sdk:DataGridTemplateColumn.CellTemplate>
                                                    </sdk:DataGridTemplateColumn>
                                                    <sdk:DataGridTemplateColumn Width="200">
                                                        <sdk:DataGridTemplateColumn.CellTemplate>
                                                            <DataTemplate>
                                                                <TextBlock Text="{Binding Path=Name}" Margin="10,0,0,0"></TextBlock>
                                                            </DataTemplate>
                                                        </sdk:DataGridTemplateColumn.CellTemplate>
                                                    </sdk:DataGridTemplateColumn>
                                                </sdk:DataGrid.Columns>
                                            </sdk:DataGrid>



 private RelayCommand _removeFromUserRolesCommand = null;
        public RelayCommand RemoveFromUserRolesCommand
        {
            get
            {
                if (_removeFromUserRolesCommand == null)
                {

                    _removeFromUserRolesCommand = new RelayCommand(
                        () => this.OnARemoveFromUserRolesCommand(),
                        () => (this._adminModel != null) /*&& IsComboEnabled*/);
                }
                return _removeFromUserRolesCommand;
            }
        }
        private void OnARemoveFromUserRolesCommand()
        {
            try
            {
                if (!_adminModel.IsBusy && SelectedAvailableRole != null)
                {
                   ...
                }
            }
            catch (Exception ex)
            {
               ...
            }
        }

我的问题是网格中的按钮不会触发。如果我将按钮放在网格之外,它可以正常工作。有人知道上面的代码出了什么问题吗?

【问题讨论】:

    标签: silverlight silverlight-4.0 mvvm


    【解决方案1】:

    您的 ItemsSource 是 CurrentUserRoles。如果您的命名约定是正确的,那么该按钮将在网格中的 DataContext 将成为它所在行的角色。除非角色具有 UsersViewModel 特征,否则您将不会成为能够挂钩该命令。

    您可能需要提供更多代码来提供上下文,并且您的解决方案可能与为网格绑定到 SelectedItem 以及能够从将删除网格的 SelectedItem 的角色。

    【讨论】:

    • 感谢您的想法。我会调查它,如果它有效,我会回来。谢谢...
    【解决方案2】:

    您的问题是该命令正在从其模板中获取上下文,并且无法访问 ViewModel 的根目录。将此类添加到您的解决方案中:

    public class DataContextProxy : FrameworkElement
        {
            public DataContextProxy()
            {
                this.Loaded += new RoutedEventHandler(DataContextProxyLoaded);
            }
    
            void DataContextProxyLoaded(object sender, RoutedEventArgs e)
            {
                Binding binding = new Binding();
                if (!String.IsNullOrEmpty(BindingPropertyName))
                {
                    binding.Path = new PropertyPath(BindingPropertyName);
                }
                binding.Source = this.DataContext;
                binding.Mode = BindingMode;
                this.SetBinding(DataContextProxy.DataSourceProperty, binding);
            }
    
            public Object DataSource
            {
                get { return (Object)GetValue(DataSourceProperty); }
                set { SetValue(DataSourceProperty, value); }
            }
    
            public static readonly DependencyProperty DataSourceProperty =
                DependencyProperty.Register("DataSource", typeof(Object), typeof(DataContextProxy), null);
    
    
            public string BindingPropertyName { get; set; }
    
            public BindingMode BindingMode { get; set; }
    
        }
    

    然后像这样在你的 XAML 中使用它:

    <UserControl.Resources>
            <library:DataContextProxy x:Key="DataContextProxy"/>
    </UserControl.Resources>
    

    然后在你的命令绑定中:

    <Button Command="{Binding DataSource.RemoveFromUserRolesCommand, Source={StaticResource DataContextProxy}}" />
    

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 2017-02-03
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多