两个视图模型如何使用catel wpf进行通信

时间:2016-02-09 13:13:08

标签: c# wpf xaml mvvm catel

我阅读了文档如何与视图模型进行通信,我尝试了它。但是无法改变。像github中的例子一样,我创建了CommunicationViewModel:

public abstract class CommunicationViewModel : ViewModelBase
{
    public CommunicationViewModel()
    {
        ExampleCommand = new Command(OnExampleCommandExecute);
    }

    public string Property
    {
        get { return GetValue<string>(PropertyProperty); }
        set { SetValue(PropertyProperty, value); }
    }
    public static readonly PropertyData PropertyProperty = RegisterProperty("Property", typeof(string), null);

    public void UpdateProperty(string modifier)
    {
        Property = modifier.ToString();
    }

    public Command ExampleCommand { get; private set; }

    private void OnExampleCommandExecute()
    {
        ExecuteCommand();
    }

    protected abstract void ExecuteCommand();

    protected void AddPropertyChange(string propertyName, Type senderType)
    {
        Argument.IsNotNull(() => propertyName);
        Argument.IsNotNull(() => senderType);
        // do some stuff
    }
}

然后从OpenViewModel我想将信息发送到MainWindowViewModel。

OpenViewModel源代码:

public class OpenViewModel : CommunicationViewModel
{
    private readonly IMessageService iMessage;
    private readonly IPleaseWaitService iPleaseWait;
    private readonly ILanguageService iLanguage;

    public OpenViewModel(IMessageService iMessageService, IPleaseWaitService iPleaseWaitService, ILanguageService iLanguageService)
    {
        Argument.IsNotNull(() => iMessageService);
        Argument.IsNotNull(() => iPleaseWaitService);
        Argument.IsNotNull(() => iLanguageService);

        iMessage = iMessageService;
        iPleaseWait = iPleaseWaitService;
        iLanguage = iLanguageService;

        ChooseDatabaseForOpen = new Command(HandleChooseDatabaseForOpen);
    }

    public ObservableCollection<string> Databases
    {
        get { return new ObservableCollection<string>(SettingGenerator.ReadFewSameDatabaseSettings("Databases", "Database", "Value")); }
        set { SetValue(DatabasesProperty, value); }
    }        
    public static readonly PropertyData DatabasesProperty = RegisterProperty("Databases", typeof(ObservableCollection<string>), () => new ObservableCollection<string>());

    public Command ChooseDatabaseForOpen { get; private set; }

    protected override async Task InitializeAsync()
    {
        await base.InitializeAsync();
        // TODO: subscribe to events here
    }

    protected override async Task CloseAsync()
    {
        // TODO: unsubscribe from events here
        await base.CloseAsync();
    }

    private void HandleChooseDatabaseForOpen()
    {
        iPleaseWait.Show(iLanguage.GetString("PleaseWaitMessage"));
        SettingGenerator.ChangeDatabaseSetting(null, "ActiveDatabase", this.Database);
        iPleaseWait.Hide();
    }

    protected override void ExecuteCommand()
    {
        // InterestedIn does not required any custom logic
    }
}

和MainWindowViewModel

[InterestedIn(typeof(OpenViewModel))]
public class MainWindowViewModel : CommunicationViewModel
{
    private const string PATH_TO_CHECKED_IMAGE = @"./../Resources/Images/Icons/Settings/Checked Checkbox.png";
    private const string PATH_TO_UNCHECKED_IMAGE = @"./../Resources/Images/Icons/Settings/Checkbox.png";

    private readonly IUIVisualizerService iUIVisualizer;
    private readonly IPleaseWaitService iPleaseWait;
    private readonly IMessageService iMessage;
    private readonly IOpenFileService iOpenFile;
    private readonly ILanguageService iLanguage;
    private readonly ISplashScreenService iSplashScreen;

    private readonly string settingFile = AppDomain.CurrentDomain.BaseDirectory + FileConstants.PATH_TO_SETTINGS_FILE;

    public MainWindowViewModel(IUIVisualizerService iUIVisualizerService, IPleaseWaitService iPleaseWaitService, IMessageService iMessageService, IOpenFileService iOpenFileService, ILanguageService iLanguageService, ISplashScreenService iSplashScreenService)
    {
        Argument.IsNotNull(() => iOpenFileService);
        Argument.IsNotNull(() => iUIVisualizerService);
        Argument.IsNotNull(() => iMessageService);
        Argument.IsNotNull(() => iPleaseWaitService);
        Argument.IsNotNull(() => iLanguageService);
        Argument.IsNotNull(() => iSplashScreenService);

        this.iOpenFile = iOpenFileService;
        this.iUIVisualizer = iUIVisualizerService;
        this.iMessage = iMessageService;
        this.iPleaseWait = iPleaseWaitService;
        this.iLanguage = iLanguageService;
        this.iSplashScreen = iSplashScreenService;

        Minimize = new Command(HandleMinimizeCommand);
        Restore = new Command(HandleRestoreCommand);
        CloseApplication = new Command(HandleCloseApplicationCommand);

        if (SettingGenerator.ReadDatabaseSetting(null, "Update") == "Automatic")
        {
            this.AutoUpgradeCheckbox = PATH_TO_CHECKED_IMAGE;
        }
        else if (SettingGenerator.ReadDatabaseSetting(null, "Update") == "Manual")
        {
            this.AutoUpgradeCheckbox = PATH_TO_UNCHECKED_IMAGE;
        }

        SelectIconForMainMenuItems();

        //this.Property = this.Database;
    }

    protected override void OnViewModelPropertyChanged(IViewModel viewModel, string propertyName)
    {
        AddPropertyChange(propertyName, viewModel.GetType());
    }

    protected override void ExecuteCommand()
    {
        // InterestedIn does not required any custom logic
    }
}

来自xaml

OpenView

<ListView Name="DatabasesListView" MinHeight="150" Width="200" ItemsSource="{Binding Databases}" SelectedItem="{Binding Property}" />

MainWindowView

<Label Content="{Binding Property}" HorizontalAlignment="Center" Margin="0 0 0 0" FontSize="14" />

如何传达这两种视图模型。在我的情况下工作的例子不起作用。当我每次更改Propertynull。不是每次都给我一些例外是空的。

编辑:我使用了两个DataWindows,而没有使用UserControls

1 个答案:

答案 0 :(得分:1)

作为documentation explains,有几种方法可以在视图模型之间进行通信:

  1. 服务
  2. 感兴趣(正在使用的是什么)
  3. MessageMediator
  4. 看起来你正在做的事情是正确的。如果您觉得它没有按预期工作,请在official tracker中提供一个repro。