Добрый день. Гугл не помогает.
Во 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));
Comentarios (12)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Добрый день
Да, именно так сделано в нашем примере https://github.com/StockSharp/StockSharp/blob/master/Samples/Common/SampleLogging/MainWindow.xaml.cs#L50
Добрый день
Верно и код работает, но данный пример сделан не по шаблону MVVM. Вопрос был, как реализовать данную строку https://github.com/Stock...g/MainWindow.xaml.cs#L50 , не нарушая шаблон проектирования архитектуры приложения MVVM ( https://ru.wikipedia.org/wiki/Model-View-ViewModel )?
Добрый день
Наши контролы созданы про общему принципу с контролами .NET Framework. Они используются в паттернах общим спобосом, независимо от того, какой контрол используется.
Добрый день
Я и не спорю,что контролы не созданы про общему принципу с контролами .NET Framework.
Поясню. 2) К какому свойству Monitor или LogControl мне нужно реализовать binding во View, чтобы в Model строка _logManager.Listeners.Add(new GuiLogListener(LogControl)); была по шаблону MVVM? 3) Или нужен другой подход? 4) Как Вы решаете данную задачу (GuiLog и MVVM)?
Есть возможный вариант, но он выдаёт исключение.
Во View
<sscontrol:LogControl Messages="" Grid.Column="0" Grid.Row="8" Grid.ColumnSpan="8" />
Во View-Model
В Model
LogControlMessages.Add(new LogMessage(new StrategyObserver(), DateTime.Now, LogLevels.Debug, "+++++++++++++"));
Исключение появляется во View

Как сделать так, чтобы LogControlMessages не было null? (public class LogMessageCollection не имеет конструкторов)
Добрый день
Приведите пожалуйста текст внутренней ошибки.
Добрый день
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)
Как сделать так, чтобы LogControlMessages не было null? (public class LogMessageCollection не имеет конструкторов)
Возможно не стоит использовать паттерн с данным контролом. На текущий день конструктор класса закрыт.
Ок,
Если кому-нибудь пригодится -> простейший gui-logger по MVVM.
Во 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; }
Здравствуйте.
Вопрос аналогичный предыдущему (только вместо sscontrol:LogControl -> sscontrol:Chart) По данному примеру из документации https://doc.stocksharp.ru/html/287125e1-7c7e-4be3-a8ce-5018538e613f.htm все работает, но реализация по MVVM заходит в тупик.
private void Connector_CandleSeriesProcessing(CandleSeries candleSeries, Candle candle) { if (candle.State == CandleStates.Finished) { var chartData = new ChartDrawData(); chartData.Group(candle.OpenTime).Add(_candleElement, candle); Chart.Draw(chartData); } }
Как реализовать поддержку Chart контрола по MVVM? К какому свойству Chart контрола (во View) делать привязку, чтобы в Model было возможным отрисовывание chartData?
Добрый день
Встроенного binding у графика нет.