Silverlight: Как вызвать событие нажатия кнопки в сетке данных и передать параметр событию с помощью команды relay? - PullRequest
0 голосов
/ 11 апреля 2011

вот мой 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)
            {
               ...
            }
        }

Моя проблема в том, что кнопка в сетке не сработает. Если я положу кнопку за пределами сетки, она работает нормально. Кто-нибудь знал, что пошло не так с кодом выше?

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Ваша проблема в том, что команда получает контекст из своего шаблона и не может получить доступ к корню 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}}" />
1 голос
/ 11 апреля 2011

Ваш ItemsSource равен CurrentUserRoles.Если ваши соглашения об именах верны, то DataContext, в котором кнопка будет находиться в сетке, будет ролью строки, в которой она находится. Если роль не имеет характеристики UsersViewModel, вы не будетевозможность подключиться к этой команде.

Возможно, вам потребуется предоставить немного больше кода для предоставления контекста, и ваше решение, вероятно, будет связано с привязкой к SelectedItem для сетки, ивозможность привязки к команде из роли, которая удалит SelectedItem для сетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...