Диалог Caliburn MVVM WPF с действием OK - PullRequest
1 голос
/ 02 апреля 2012

Я переписываю проект в WPF с использованием фреймворка Caliburn. Я пришел из мира C ++, поэтому у меня возникли трудности с поиском даже самых простых вещей ...

Итак, допустим, у меня есть: MainView, MainViewModel, DialogView, DialogViewModel.

В MainView.xaml: ...

<MenuItem Name="Dialog" Header="Dialog"></MenuItem>

... Caliburn связывает его с методом в MainViewModel:

public void Dialog()
        {
            dynamic settings = new ExpandoObject();
            settings.WindowStartupLocation = WindowStartupLocation.Manual;
            _windowManager.ShowWindow(new DialogViewModel(_windowManager), null, settings);
        }

Работает нормально, выскакивает диалог.

Теперь в этом диалоге у меня есть:

<TextBox Name="Dimension1"/>
<TextBox Name="Dimension2"/>

плюс, другие текстовые поля, флажки и т. Д. Тогда есть кнопки ОК и Отмена:

<Button Content="OK" Name="OK"></Button>
<Button Content="Cancel" Name "Cancel"></Button> 

Теперь, как и сейчас, они связаны с методами OK () и Cancel () в DialogViewModel, и я не могу выяснить или найти информацию о том, как с ними обращаться в DialogViewModel.
Я нашел пример, когда создается класс DialogResultsAction, я могу связать свои кнопки OK / Отмена с методами в этом классе, но не могу понять, как действовать дальше ...

Можете ли вы посоветовать мне, в каком направлении мне идти?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Я не уверен, что это то, что вы ищете, но вы можете рассматривать DialogViewModel как любой другой экран. В этом примере Ok и Cancel привязываются к соответствующим методам. Технически вы можете установить x:Name="TryClose" для имени кнопки отмены, но я назвал его Отмена для этого примера.

В методе Open в ShellViewModel вы можете предварительно установить значения в диалоговом окне перед его отображением. И после того, как результат возвращается, так как у вас есть ссылка на него, вы также можете прочитать эти значения.

Открытый метод в ShellViewModel:

 public void Open()
    {
        var dialogViewModel = IoC.Get<DialogViewModel>();
        dialogViewModel.Dimension1 = "123";
        dialogViewModel.Dimension2 = "456";
        var result = WindowManager.ShowDialog(dialogViewModel);
        if (dialogViewModel.MyDialogResult == DialogResult.OK) return;

        //do stuff with results            
        var dim1 = dialogViewModel.Dimension1;
    }

DialogView:

<Grid>
        <StackPanel>
            <TextBlock x:Name="Dimension1" />
            <TextBlock x:Name="Dimension2" />
        </StackPanel>
        <StackPanel Height="50"
                    Orientation="Horizontal">
            <Button x:Name="Ok"
                    Content="Ok" />
            <Button x:Name="Cancel"
                    Content="cancel" />
        </StackPanel>
    </Grid>

DialogViewmodel:

[Export(typeof (DialogViewModel))]
public class DialogViewModel : Screen
{
    private string _dimension1;
    public string Dimension1
    {
        get { return _dimension1; }
        set
        {
            _dimension1 = value;
            NotifyOfPropertyChange(() => Dimension1);
        }
    }

    private string _dimension2;
    public string Dimension2
    {
        get { return _dimension2; }
        set
        {
            _dimension2 = value;
            NotifyOfPropertyChange(() => Dimension2);
        }
    }

    public void Ok()
    {
        //Do stuff
        MyDialogResult = DialogResult.OK;
        TryClose();
    }

    public void Cancel()
    {
        MyDialogResult = DialogResult.Cancel;
        TryClose();        
    }
}
0 голосов
/ 02 апреля 2012

Если ваша ViewModel основана на IScreen, используйте Close в методе Ok или Cancel. Если вам нужно вернуть результат, я бы предложил использовать IEventAggregator, чтобы передать результат родителю. Если вам действительно нужно, вы можете использовать GetView (), чтобы получить представление, связанное с моделью представления, привести его к нужному типу и установить результат (предполагая, что представление имеет результат, я не использовал класс Dialog).

...