Вопросы по MVVM

Вопросы по MVVM
Atom
8/6/2018
Дмитрий_


Добрый день. Гугл не помогает.

Во View имею sscontrol:LogControl

<sscontrol:LogControl x:Name="LogControl" Grid.Column="0" Grid.Row="8" Grid.ColumnSpan="8" />

В Model находится LogManager

private readonly LogManager _logManager = new LogManager();

Вопрос: Как правильно добавить GuiLogListener слушателя к _logManager, не нарушая MVVM?

_logManager.Listeners.Add(new GuiLogListener(LogControl));


Tags:


Thanks:


1 2  >
Support

Avatar
Date: 8/6/2018
Reply


Добрый день

Да, именно так сделано в нашем примере https://github.com/StockSharp/StockSharp/blob/master/Samples/Common/SampleLogging/MainWindow.xaml.cs#L50

Thanks:

Дмитрий_

Avatar
Date: 8/6/2018
Reply


Добрый день

Верно и код работает, но данный пример сделан не по шаблону MVVM. Вопрос был, как реализовать данную строку https://github.com/Stock...g/MainWindow.xaml.cs#L50 , не нарушая шаблон проектирования архитектуры приложения MVVM ( https://ru.wikipedia.org/wiki/Model-View-ViewModel )?

Thanks:

Support

Avatar
Date: 8/7/2018
Reply


Добрый день

Наши контролы созданы про общему принципу с контролами .NET Framework. Они используются в паттернах общим спобосом, независимо от того, какой контрол используется.

Thanks:

Дмитрий_

Avatar
Date: 8/7/2018
Reply


Добрый день

Я и не спорю,что контролы не созданы про общему принципу с контролами .NET Framework.

  1. Вопрос был, как реализовать строку https://github.com/StockSharp/StockSharp/blob/master/Samples/Common/SampleLogging/MainWindow.xaml.cs#L50 , не нарушая шаблон проектирования архитектуры приложения MVVM?

Поясню. 2) К какому свойству Monitor или LogControl мне нужно реализовать binding во View, чтобы в Model строка _logManager.Listeners.Add(new GuiLogListener(LogControl)); была по шаблону MVVM? 3) Или нужен другой подход? 4) Как Вы решаете данную задачу (GuiLog и MVVM)?

Thanks:

Дмитрий_

Avatar
Date: 8/9/2018
Reply


Есть возможный вариант, но он выдаёт исключение.

Во View

<sscontrol:LogControl Messages="" Grid.Column="0" Grid.Row="8" Grid.ColumnSpan="8" />

Во View-Model

    public LogMessageCollection LogControlMessages
    {
        get { return downloaderM.LogControlMessages; }
        set
        {
            downloaderM.LogControlMessages = value;
            OnPropertyChanged();
        }
    }

В Model

LogControlMessages.Add(new LogMessage(new StrategyObserver(), DateTime.Now, LogLevels.Debug, "+++++++++++++"));

Исключение появляется во View Снимок.PNG Снимок.PNG

Как сделать так, чтобы LogControlMessages не было null? (public class LogMessageCollection не имеет конструкторов)

Снимок.PNG 11 KB (765) Снимок.PNG 114 KB (999)
Thanks:

Support

Avatar
Date: 8/10/2018
Reply


Добрый день

Приведите пожалуйста текст внутренней ошибки.

Thanks:

Дмитрий_

Avatar
Date: 8/10/2018
Reply


Добрый день

System.Windows.Markup.XamlParseException: '"Задание свойства "StockSharp.Xaml.LogControl.Messages" вызвало исключение.": номер строки "86" и позиция в строке "31".' ArgumentNullException: Значение не может быть неопределенным.

StackTrace в StockSharp.Xaml.LogControl.#=qv1cxjjxQCJGrTsmD_OIPyHN1T2kDut4cQ$7fRdFMrtk=(LogMessageCollection #=qFz1XRL0F7TtXcoTGTU_NJw==) в StockSharp.Xaml.LogControl.#=qztdWRVJpOGPrVBNzIk8hEUU2RBOL0_5nD26bcLlgHuc=(DependencyObject #=qT_3wg4AVpI3UsCy5v8eTgA==, DependencyPropertyChangedEventArgs #=qUByj$GkMSWKTiWxctUdQTQ==) в System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) в System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) в System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal) в System.Windows.Baml2006.WpfMemberInvoker.SetValue(Object instance, Object value) в MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value) в MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)

Снимок.PNG

Как сделать так, чтобы LogControlMessages не было null? (public class LogMessageCollection не имеет конструкторов)

Снимок.PNG 9 KB (931)
Thanks:

Support

Avatar
Date: 8/10/2018
Reply


Возможно не стоит использовать паттерн с данным контролом. На текущий день конструктор класса закрыт.

Thanks:

Дмитрий_

Avatar
Date: 8/10/2018
Reply


Ок,

  1. У Вас есть похожий лог контрол, который поддерживает MVVM?
  2. Почему у Вас скрыт данный конструктор класса? (Что нужно, чтобы его открыть?)
Thanks:

Дмитрий_

Avatar
Date: 8/10/2018
Reply


Если кому-нибудь пригодится -> простейший gui-logger по MVVM. Снимок.PNG

Во View:

<DataGrid ItemsSource="" Grid.Column="0" Grid.Row="8" Grid.ColumnSpan="8" />

Во View-Model:

public ListCollectionView MessageCollection { get { return downloaderM.MessageCollection; } set { downloaderM.MessageCollection = value; OnPropertyChanged(); } }

В Model:

private ListCollectionView logMessageCollection; private ObservableCollection<LogMessage> logMessageObservableCollection = new ObservableCollection<LogMessage>();

В конструкторе: logMessageCollection = new ListCollectionView(logMessageObservableCollection);

Для добавления лога: App.Current.Dispatcher.Invoke(() => { logMessageObservableCollection.Add(new LogMessage("Test1", "Test2", "Test3")); }); Где класс LogMessage, это internal class LogMessage { public DateTime CurrentTime { get; set; } public string Type { get; set; } public string SourceName { get; set; } public string Message { get; set; }

    public LogMessage(string type, string sourceName, string message)
    {
        CurrentTime = DateTime.Now;
        Type = type;
        SourceName = sourceName;
        Message = message;
    }
}
Снимок.PNG 5 KB (882)
Thanks: Support
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy