Привязка события Combobox SelectionChanged - PullRequest
0 голосов
/ 02 мая 2020

У меня следующий xaml:

<DataGridTemplateColumn Header="123">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Role}"/>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <ComboBox ItemsSource="{Binding Path=DataContext.Roles, 
                  RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding Path = DataContext.UpdateUserCommand}" /> // bind fails there
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ComboBox>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

Проблема в том, что моя команда не выполняется при изменении, но если переместить определение комбинированного списка из таблицы данных, моя команда успешно запускается. Похоже, я неправильно связался, но я не могу понять, что случилось.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Просто свяжите свойство SelectedItem ComboBox со свойством SelectedRole в вашей модели представления.

Чтобы запустить асинхронное действие c при изменении свойства модели представления, просто присоедините асин c Обработчик события PropertyChanged в модели представления:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public ViewModel()
    {
        PropertyChanged += async (s, e) =>
        {
            if (e.PropertyName == nameof(SelectedRole))
            {
                await SomeAsyncAction();
            }
        };
    }

    private Role selectedRole;

    public Role SelectedRole
    {
        get { return selectedRole; }
        set
        {
            selectedRole = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(SelectedRole)));
        }
    }

    private async Task SomeAsyncAction()
    {
        ...
    }
}
0 голосов
/ 02 мая 2020

Вы можете попробовать это (не на 100% уверен, что это сработает, потому что не видит весь ваш код)

<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=DataContext.UpdateUserCommand}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...