Это плохая практика для вызова метода из CheckBox в UWP - PullRequest
0 голосов
/ 03 октября 2018

Я изучаю UWP с MVVM с Призмой.Я хотел вызвать метод из моей ViewModel с помощью флажка.Вот ViewModel.

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
    }

    public async Task DoSomething()
    {
        await Task.Delay(5000);
    }
} 

Я надеялся вызвать этот метод непосредственно из xaml, например:

<Grid>
    <CheckBox x:Name="chkBox" Checked="{x:Bind ViewModel.DoSomething,Mode=TwoWay}" Content="Click me!" 
    HorizontalAlignment="Left" Margin="118,90,0,0" VerticalAlignment="Top" ></CheckBox>
</Grid>

Когда я запускаю приложение, я получаю ошибку:

Error       TwoWay binding target 'Checked' must be a dependency property

Что это значит?

Должен ли я привязать свойство IsChecked к ViewModel и вызвать событие?:

public class MainViewModel : ViewModelBase
{
    private bool _isChecked;
    event EventHandler checkedEvent;

    public bool isChecked
    {
        get { return _isChecked; }
        set
        {
            SetProperty(ref _isChecked, value);
            checkedEvent?.Invoke(this, new EventArgs());
        }
    }


    public MainViewModel()
    {
        checkedEvent += MainViewModel_checkedEvent;
    }

    private async void MainViewModel_checkedEvent(object sender, EventArgs e)
    {
        await DoSomething();
    }

    public async Task DoSomething()
    {
        await Task.Delay(5000);
    }
}

Xaml:

<Grid>
    <CheckBox x:Name="chkBox" IsChecked="{x:Bind ViewModel.isChecked,Mode=TwoWay}" Content="Click me!" HorizontalAlignment="Left" Margin="118,90,0,0" VerticalAlignment="Top" ></CheckBox>
</Grid>

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Вы можете вызвать метод ViewModel непосредственно из события Click флажка.

        Click="{x:Bind ViewModel.DoSomething}"
0 голосов
/ 04 октября 2018

Две вещи:

  • Снять двустороннюю часть.Это не может работать в случае.Самое большее, сделайте это OneWay, лучше всего OneTime, если сможете.

  • Может ли X: привязывать события к асинхронным задачам?Возможно, вам придется сделать его асинхронным, но попробуйте в любом случае

0 голосов
/ 03 октября 2018
public bool isChecked
    {
        get { return _isChecked; }
        set
        {
            SetProperty(ref _isChecked, value);
            checkedEvent?.Invoke(this, new EventArgs());
            OnPropertyChanged("isChecked");
        }
    }

Также вы можете использовать событие OnPropertyChanged для уведомления об изменениях свойств

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