Проблема с ViewModel - PullRequest
       9

Проблема с ViewModel

0 голосов
/ 29 февраля 2020

Мне нужно всплывающее окно, которое занимает время. Кнопка находится в нажатом состоянии, пока не откроется новое окно. Поэтому я хочу добавить индикатор ожидания поверх окна пользовательского интерфейса после того, как я нажму кнопку и до того, как окно откроется. Код ViewModel правильный, потому что я ссылался на пример кода. Но почему нет ответа после нажатия кнопки.

URL файла проекта

https://supportcenter.devexpress.com/attachment/file/5268961b-ce35-4e40-b7c1-e33bffab902b

MainWindow:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using DevExpress.Xpf.Core;

namespace WaitIndicatorDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : DXWindow
    {

        public MainWindow()
        {
            InitializeComponent();
            vm = new MainVM();
            DataContext = vm;
        }

        MainVM vm;

        private void buttonShow_Click(object sender, RoutedEventArgs e)
        {
            vm.IsBusy = !vm.IsBusy;
        }
    }
}

ViewMode:

    using DevExpress.Mvvm;

namespace WaitIndicatorDemo
{
    public class MainVM
    {
        private readonly ISplashScreenService _waitIndicatorService;

        public virtual bool IsBusy { get; set; }

        public MainVM()
        {
            _waitIndicatorService = 
                ServiceContainer.Default.GetService<ISplashScreenService>("WaitIndicatorService");
        }

        protected void OnIsBusyChanged()
        {
            if (IsBusy)
                _waitIndicatorService.ShowSplashScreen();
            else
                _waitIndicatorService.HideSplashScreen();
        }
    }
}

Ниже XAML, комментарии - это оригинальный пример кода. Флажок привязать к IsBusy. Индикатор всплывает, когда флажок установлен. Теперь я хочу всплыть после нажатия кнопки.

    <dx:DXWindow x:Class="WaitIndicatorDemo.MainWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
             xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
             xmlns:waitIndicatorDemo="clr-namespace:WaitIndicatorDemo"
             xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
             WindowStartupLocation="CenterScreen" SnapsToDevicePixels="True"
               Title="MainWindow" Height="350" Width="525">
             <!--DataContext="{dxmvvm:ViewModelSource Type=waitIndicatorDemo:MainVM}"-->
             <!--Title="MainWindow" Height="350" Width="525">-->

    <Grid Margin="10">
        <!--<dxe:CheckEdit Content="Is Busy" IsChecked="{Binding IsBusy}" 
                       VerticalAlignment="Top" HorizontalAlignment="Left" />

        <Button Content="Button1" IsEnabled ="{Binding IsBusy, Converter={dxmvvm:BooleanNegationConverter}}"
                VerticalAlignment="Top" HorizontalAlignment="Center" Click="Button_Click"/>

        <Button Content="Button2" IsEnabled="{Binding IsBusy, Converter={dxmvvm:BooleanNegationConverter}}"
                VerticalAlignment="Top" HorizontalAlignment="Right"/>-->
        <Button x:Name="buttonShow" Content="Show"  HorizontalAlignment="Left" Height="35" Margin="50,70,0,0" VerticalAlignment="Top" Width="75" Click="buttonShow_Click" />

    </Grid>
</dx:DXWindow>

1 Ответ

0 голосов
/ 29 февраля 2020

В вашем образце кода есть несколько ошибок:
1- Метод OnIsBusyChanged в вашей ViewModel никогда не вызывается.
2- Ваш XAML не объявляет никакой объект ISplashScreenService в поведении Window Как например DXSplashScreenService.

Вот как вы можете исправить обе эти проблемы.

Сначала исправьте ViewModel.

public class MainVM
{
    private readonly ISplashScreenService _waitIndicatorService;

    private bool _isBusy;
    public virtual bool IsBusy 
    {
        get
        {
            return _isBusy;
        }

        set
        {
            _isBusy = value;
            OnIsBusyChanged();
        }
    }

    public MainVM()
    {
        _waitIndicatorService = 
            ServiceContainer.Default.GetService<ISplashScreenService>("WaitIndicatorService");
    }

    protected void OnIsBusyChanged()
    {
        _waitIndicatorService.SetSplashScreenState("Doing some work...");

        if (IsBusy)
            _waitIndicatorService.ShowSplashScreen();
        else
            _waitIndicatorService.HideSplashScreen();
    }
}

Затем ваш XAML .

<dx:DXWindow x:Class="WaitIndicatorDemo.MainWindow"
    <!-- ... -->
    Title="MainWindow" Height="350" Width="525">

    <dxmvvm:Interaction.Behaviors>
        <dx:DXSplashScreenService x:Name="WaitIndicatorService">
            <dx:DXSplashScreenService.ViewTemplate>
                <DataTemplate>
                    <Grid>
                        <Border Background="LightGray" CornerRadius="5">
                            <Border BorderBrush="#FF0072C6" BorderThickness="1" Margin="15" CornerRadius="5">
                                <Grid>
                                    <ProgressBar BorderThickness="0" Value="{Binding Progress}" Maximum="{Binding MaxProgress}" IsIndeterminate="{Binding IsIndeterminate}" Height="12" />
                                    <TextBlock Text="{Binding State, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                </Grid>
                            </Border>
                        </Border>
                    </Grid>
                </DataTemplate>
            </dx:DXSplashScreenService.ViewTemplate>
        </dx:DXSplashScreenService>
    </dxmvvm:Interaction.Behaviors>

    <Grid Margin="10">
        <!-- ... -->
    </Grid>
</dx:DXWindow>

Этот код в основном взят из Как: использовать образец DxSplashScreenService .

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