Есть ли способ изменить выбранный элемент меню из ViewModel?

Я пытаюсь изменить выбранный элемент меню из моей ViewModel в моем приложении Xamarin.Forms. Как я могу это изменить?

Я привязал свойство ListView SelectedItem к полю в моей ViewModel с режимом «TwoWay». Также я использовал BeginInvokeOnMainThread и ContinueWith. Чтобы привязать событие, я создал поведение и привязал команду к событию. Все способы не изменили выбранный элемент.

<ListView
            x:Name="ListViewMenu"
            HasUnevenRows="True"
            ItemsSource="{Binding menuItems}"
            SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
<ListView.Behaviors>
                <behaviors:EventToCommandBehavior
                    Command="{Binding command}"
                    Converter="{StaticResource SelectedItemConverter}"
                    EventName="ItemSelected" />
            </ListView.Behaviors>
private HomeMenuItem selectedItem { get; set; }
        public HomeMenuItem SelectedItem
        {
            get { return selectedItem; }
            set
            {
                selectedItem = value;
                this.OnPropertyChanged();
            }
        }
command = new AsyncRelayCommand((sender) => this.ItemSelected(sender).ContinueWith((arg) =>
            {
                HomeMenuItem menuItem = sender as HomeMenuItem;

                if(menuItem.Id != SelectedItem.Id)
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        SelectedItem = menuItems.Where(s => s.Id.Equals(menuItem.Id)).FirstOrDefault();
                    });
            }));

Я ожидал изменить выбранный элемент с идентификатора элемента 2 на идентификатор 0, но он всегда остается на идентификаторе 2, даже если переменная SelectedItem изменена на идентификатор 0. Я имею в виду, что визуальное представление не меняется.


person Brath    schedule 02.07.2019    source источник


Ответы (1)


Я написал простую демонстрацию, чтобы обновить выбранный элемент меню, вы можете обратиться к нему. Когда я нажимаю кнопку, выбранный элемент списка вернется к первому, независимо от того, какой из них я нажму

введите здесь описание изображения

Есть MainPage.xml

   <StackLayout>
    <Button Command="{Binding UpdateCommand}"></Button>
    <ListView
        x:Name="ListViewMenu"
        HasUnevenRows="True"
        ItemsSource="{Binding menuItems}"
        SelectedItem="{Binding SelectedItem, Mode=TwoWay}">

        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout>
                        <Label Text="{Binding Name}" />
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>   
    </ListView>
</StackLayout>

MainPage.xml.cs

общедоступный частичный класс MainPage : ContentPage {

    public MainPageModelView model { get; set; }
    public MainPage()
    {
        InitializeComponent();



        model = new MainPageModelView();
        BindingContext = model;
    }


}

MainPageModelView.cs

public class MainPageModelView: INotifyPropertyChanged
{
    public ObservableCollection<HomeMenuItem> menuItems { set; get; }
    public event PropertyChangedEventHandler PropertyChanged;

    public MainPageModelView()
    {
        menuItems = new ObservableCollection<HomeMenuItem>();
        menuItems.Add(new HomeMenuItem() { Name = "Mr. Mono1", Id = 1 });
        menuItems.Add(new HomeMenuItem() { Name = "Mr. Mono2", Id = 2 });
        menuItems.Add(new HomeMenuItem() { Name = "Mr. Mono3", Id = 3 });
        menuItems.Add(new HomeMenuItem() { Name = "Mr. Mono4", Id = 4 });
    }

    private HomeMenuItem selectedItem { get; set; }
    public HomeMenuItem SelectedItem
    {
        get { return selectedItem; }
        set
        {
            selectedItem = value;
            this.OnPropertyChanged();
        }
    }


    Command _updateCommand;

    public Command UpdateCommand
    {
        get
        {
            return _updateCommand ?? (_updateCommand = new Command(ExecuteSaveCommand));
        }
    }
    void ExecuteSaveCommand()
    {
        Device.BeginInvokeOnMainThread(() =>
        {
               SelectedItem = menuItems[0];
        });
        //SelectedItem = menuItems.Where(s => s.Id.Equals(menuItem.Id)).FirstOrDefault();

    }
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this,
        new PropertyChangedEventArgs(propertyName));
    }
}
person Leon Lu - MSFT    schedule 02.07.2019
comment
@Brath Есть ли какие-либо обновления для этой проблемы? Если ответ полезен, попробуйте пометить его как ответ, это поможет другим, у кого есть похожая проблема. - person Leon Lu - MSFT; 03.07.2019