2013-10-04 4 views
-1

Мне нужно создать GUI-DLL-компонент, который следует использовать в качестве диалога. Этот диалог выполняет некоторые вычисления, а затем выполняет поиск в базе данных для результата (предположим, что результатом является число).Создание пользовательских диалогов в MVVM с помощью Catel

Результат привязан к виду через публичное свойство viewmodel.

Пользователь хочет создать объект этого компонента GUI и открыть диалоговое окно после того, как расчет будет выполнен, пользователю необходимо получить доступ к результату в более поздний момент времени.

Я хочу спросить, как получить доступ к общедоступному свойству (Result) viewmodel после интуиции объекта, потому что я не знаю, как это сделать способом MVVM. Моим темпоральным решением является передача контекста данных окна в код позади, а затем доступ к его публичному свойству. Но это не MVVM (в этом случае диалог выводится из класса окна. И после вызова метода .showdialog() нет способа получить доступ к общедоступному свойству viewmodel окна).

Как я могу сделать это с помощью MVVM?

Большое спасибо за помощь :).

С наилучшими пожеланиями,

Minh

Edit:

вот мой код:

XAML:

<catel:DataWindow x:Class="WpfApplication3.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:catel="http://catel.codeplex.com" 
        mc:Ignorable="d" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:viewmodel="clr-namespace:WpfApplication3.ViewModels" 
        d:DesignHeight="273" 
        d:DesignWidth="457" 
        SizeToContent="WidthAndHeight"> 

    <Window.DataContext> 
     <viewmodel:MainWindowViewModel></viewmodel:MainWindowViewModel> 
    </Window.DataContext>  

    <Grid> 
     <Button Content="Calc 1+1" 
       Height="39" 
       Name="button1" 
       Width="87" 
       Command="{Binding CalcCmd}"/> 

     <TextBox Height="23" 
       HorizontalAlignment="Left" 
       Name="textBox1" 
       VerticalAlignment="Top" 
       Width="87" 
       Margin="174,152,0,0" 
       Text="{Binding Result}"/> 

     <Label Content="Result:" 
       Height="28" 
       HorizontalAlignment="Left" 
       Margin="111,152,0,0" 
       Name="label1" 
       VerticalAlignment="Top" 
       Width="46" /> 
    </Grid>   
</catel:DataWindow> 

Код За:

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 Catel.Windows; 
using WpfApplication3.ViewModels; 

namespace WpfApplication3 
{ 
    /// <summary> 
    /// Interaktionslogik für MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : DataWindow 
    { 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public MainWindow(MainWindowViewModel mainWindowViewModel) 
      : base(mainWindowViewModel) 
     { 
      InitializeComponent(); 
     } 

    //Temporal solution 
    public string Result 
    { 
     get { 
      MainWindowViewModel vm = (MainWindowViewModel)this.DataContext; 
      return vm.Result; 
     } 
    } 
    } 
} 

ViewModel:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Catel.MVVM; 
using Catel.Data; 

namespace WpfApplication3.ViewModels 
{ 
    /// <summary> 
    /// name view model. 
    /// </summary> 
    public class MainWindowViewModel : ViewModelBase 
    { 
     #region Fields 
     #endregion 

     #region Constructors 
     /// <summary> 
     /// Initializes a new instance of the <see cref="MainWindowViewModel"/> class. 
     /// </summary> 
     public MainWindowViewModel() 
     { 
      registeringCommands(); 
     } 
     #endregion 

     #region Properties 
     /// <summary> 
     /// Gets the title of the view model. 
     /// </summary> 
     /// <value>The title.</value> 
     public override string Title { get { return "MyMainWindow"; } } 

     /// <summary> 
     /// Gets or sets the property value. 
     /// </summary> 
     public string Result 
     { 
      get { return GetValue<string>(ResultProperty); } 
      set { SetValue(ResultProperty, value); } 
     } 

     /// <summary> 
     /// Register the Result property so it is known in the class. 
     /// </summary> 
     public static readonly PropertyData ResultProperty = 
      RegisterProperty("Result", typeof(string), null); 

     #endregion 

     #region Commands 
     /// <summary> 
     /// Gets the name command. 
     /// </summary> 
     public Command CalcCmd { get; private set; } 

     /// <summary> 
     /// Method to invoke when the name command is executed. 
     /// </summary> 
     private void execute_CalcCmd() 
     { 
      try { 
       Result = (1 + 1).ToString(); 
      } 
      catch(Exception ex) 
      { 
       throw; 
       //log 
      } 
     } 
     #endregion 

     #region Methods 
     private void registeringCommands() 
     { 
      CalcCmd = new Command(execute_CalcCmd); 
     } 
     #endregion 
    } 
} 
+0

Что вы сделали до сих пор? Что-нибудь? – meilke

+0

Я хочу спросить, как получить доступ к общедоступному свойству (result) viewmodel после интуиции объекта, потому что я не знаю, как это сделать на MVVM-пути. Моим темпоральным решением является передача контекста данных окна в код позади, а затем доступ к его публичному свойству. Но это не MVVM. –

ответ

1

Вы можете передать экземпляр вид модели для метода ShowDialog в UIVisualizerService. Эта модель будет по-прежнему доступна после закрытия окна, и это та же модель просмотра, которая используется в DataWindow. Вы можете просто использовать значение в модели вызывающего вида.

Если результат должен использоваться во многих классах, лучше создать для него выделенный класс/службу и зарегистрировать его в ServiceLocator. Например, настройки: ISettings, которые вы изменяете в DataWindow, и вы можете читать где угодно, запрашивая ServiceLocator/DependencyResolver или позволяя им вводиться в классы, в которых вам нужна информация.

+0

Thx для ответа :). Кстати, я прочитал вашу статью о DataWindow: https://catelproject.atlassian.net/wiki/display/CTL36/DataWindow#DataWindow-UsingtheDataWindowinMVVM. В коде позади я получил исключение синтаксического анализатора xaml, следуя примеру без пустого конструктора. Я сделал что-то не так? –

Смежные вопросы