none
Дублируется информация на закладках TabControl'а RRS feed

  • Общие обсуждения

  • Добрый день, участники форума. Говорю сразу- если я в формулировке этого вопроса предоставил слишком мало информации для понимания сути вопроса, в частности информации по моему приложению, то напишите, пожалуйста, об этом в ответе и я предоставлю более подробную информацию. Т.к. решить проблему, описанную в этом вопросе - это для меня очень важно. И так. Пишу приложение WPF MVVM. В главном окне приложения использую TabControl, который привязан к свойству Workspace модели представления - класса MainWindowViewModel. Это свойство - экземпляр ObservableCollection. Закдадки этого TabControl создаются во время работы приложения динамически, при щелчке по кнопке. Структура представления информации одинакова для всех закладок. Для простоты возьмём, что закладка содержит только один комбобокс. На каждой закладке должны быть представлены данные из соответствующего элемента коллекции Workspace. Новая закладка на TabControl создаётся вместе с новым элементом коллекции.  Проблема следующая: когда я создаю 1-ю закладку и выбираю элемент в её комбобоксе, то при создании следующей закладки, в её комбобоксе уже выбран этот же элемент. Так же если уже создано несколько закладок и на одной из них был выполнен выбор в комбобоксе, то при переходе на любую другую закладку, в комбобоксе этой закладки уже стоит этот же выбор, хотя он там не выполнялся. А этого, разумеется, быть не должно. Ниже привожу всю разметку, с помощью которой всё это создаётся. Вот разметка главного окна приложения:

    <Window x:Class="Multifutures_Balalaika.MainWindow". . .>
        <Window.Resources>
            <ResourceDictionary Source="MainWindowResources.xaml" />
        </Window.Resources>
    
        <Border Grid.Row="2" Style="{StaticResource MainBorderStyle}">
                <!--Содержимое привязано к свойству Workspaces модели представления,
                -->
                <ContentControl Content="{Binding Path=Workspaces}"
                                ContentTemplate="{StaticResource WorkspacesTemplate}"
                                Style="{StaticResource MainCCStyle}"/>
        </Border>
    </Window>

    Это окно содержит ссылку на ResourceDictionary, как на оконный ресурс, и элемент ContentControl, чьё свойство ContentTemplate установлено на шаблон WorkspaceTemplate, определённый в ResourceDictionary. НИже привожу шаблон WorkspaceTemplate:

    <!--Шаблон WorkspacesTemplate определяет, что область рабочих пространств
            в главном окне приложения показывается в виде TabControl.-->
        <DataTemplate x:Key="WorkspacesTemplate">
            <TabControl 
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding}"
                ItemTemplate="{StaticResource ClosableTabItemTemplate}"
                Margin="4"
                />
        </DataTemplate>

    Как видно из приведённой разметки, шаблон WorkspaceTemplate описывает TabControl, свойство ItemTemplate которого установлено в шаблон ClosableItemTemplate, который определён там же в ResourceDictionary. Привожу разметку ClosableItemTemplate:

    <!--Шаблон ClosableTabItemTemplate определяет вид вкладки TabControl'а
            с кнопкой закрытия вкладки.-->
        <DataTemplate x:Key="ClosableTabItemTemplate">
            <DockPanel Width="120">
                <Button 
            Command="{Binding Path=CloseCommand}"
            Content="X"
            Cursor="Hand"
            DockPanel.Dock="Right"
            Focusable="False"
            FontFamily="Courier" 
            FontSize="9"
            FontWeight="Bold"  
            Margin="0,1,0,0"
            Padding="0"
            VerticalContentAlignment="Bottom"
            Width="16" Height="16" />
                <!--Представляет заголовок вкладки-->
                <ContentPresenter 
            Content="{Binding Path=Isin}" 
            VerticalAlignment="Center" />
            </DockPanel>
        </DataTemplate>

    Шаблон ClosableItemTemplate, это шаблон закладки  TabControl'а. Там же, в ResourceDictionary, есть ещё один шаблон, который отображает элемент коллекции Workspaces на UserControl для визуализации на вкладке TabControl данных из элемента коллекции Workspaces. Workspaces содержит экземпляры класса FuturesTradeViewModel. Ниже привожу разметку этого шаблона, FuturesTradeView - название UserControl'а.

    <!--Этот шаблон применяет ("прикладывает") FuturesTradeView
            к экземпляру класса FuturesTradeViewModel, показываемому
            в главном окне.-->
        <DataTemplate DataType="{x:Type vm:FuturesTradeViewModel}">
            <vw:FuturesTradeView />
        </DataTemplate>

    А сейчас приведу XAML самого UserControl'а FuturesTradeView:

    <UserControl x:Class="Multifutures_Balalaika.View.FuturesTradeView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:vm="clr-namespace:Multifutures_Balalaika.View"
                 HorizontalAlignment="Center" VerticalAlignment="Center">
    
            <!--Разметочная сетка для информации по торгуемому инструменту-->
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <!--Выбор торгуемого фьючерса-->
                <Label Grid.Row="0" Grid.Column="0" Content="Торгуемый фьючерс" HorizontalAlignment="Center"/>
                <ComboBox x:Name="TradedFutures_Cmb" Grid.Row="1" Grid.Column="0" IsReadOnly="True"
                      ItemsSource="{Binding Path=FutSessContents, Mode=OneTime}"
                      SelectedIndex="{Binding Path=SelectedIndex, Mode=OneWayToSource}"
                      DisplayMemberPath="InstrumentName" Margin="5,0,5,9" />
            </Grid>
    </UserControl>

    Комбобокс в этом UserControl'е привязан к свойствам экземпляра FuturesTradeViewModel. Если нужна более подробная информация по моему приложению - я её предоставлю. Скажите только. Сижу с этой проблемой уже с вторника этой ннедели и ничего не могу сделать. Помогите, пожалуйста.

    P.S. Если нужен код классов на C#, то напишите, пожалуйста, об этом в ответе. И я его предоставлю.




    6 сентября 2013 г. 11:38

Все ответы

  • К слову. Пробовал убирать IsSynchronizedWithCurrentItem из шаблона TabControl'а. Т.е. вместо такой разметки

    <DataTemplate x:Key="WorkspacesTemplate">
            <TabControl 
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding}"
                ItemTemplate="{StaticResource ClosableTabItemTemplate}"
                Margin="4"
                />
        </DataTemplate>

    Применял вот такую

    <DataTemplate x:Key="WorkspacesTemplate">
            <TabControl 
                ItemsSource="{Binding}"
                ItemTemplate="{StaticResource ClosableTabItemTemplate}"
                Margin="4"
                />
        </DataTemplate>

    Или вот такую:

    <DataTemplate x:Key="WorkspacesTemplate"> <TabControl IsSynchronizedWithCurrentItem="False" ItemsSource="{Binding}" ItemTemplate="{StaticResource ClosableTabItemTemplate}" Margin="4" /> </DataTemplate>

    Но эффект только отрицательный. Либо на вкладке не показывается её содержимое, либо дублирование информации остаётся. Как же всё-таки решить эту проблему?

    6 сентября 2013 г. 11:48
  • Добрый день, коллега.

    У меня такое ощущение, что вы в свою коллекцию добавляете один и тот же объект.

    6 сентября 2013 г. 13:06
    Отвечающий
  • Во! Алексей, кстати у меня тоже такое впечатление!
    • Изменено TownSparrow 6 сентября 2013 г. 13:20
    6 сентября 2013 г. 13:20
  • Ну или сами посмотрите, или покажите тот фрагмент кода, в котором у вас добавляются новые элементы в вашу коллекцию.
    6 сентября 2013 г. 13:22
    Отвечающий
  • Но понимаете в чём дело. Вот, например, я запустил свою программу, подсоединился к бирже, загрузил справочники и, вслед за этим, создал самую первую закладку и выбрал в её комбобоксе инструмент. Тут без нареканий, как говорится. Затем, я создаю следующую закладку и когда она создалась, то в её комбобоксе уже выбран инструмент, выбранный в 1-й закладке. Я открываю выпадающий список комбобокса и перевыбираю инструмент на другой. Затем, перехожу на первую закладку и вижу, что в её комбобоксе уже выбран тот инструмент, который я выбрал только что на второй закладке. НО. Когда я в отладчике смотрю элементы коллекции Workspaces, информация из которых показывается на закладках, то вижу, что в их полях и свойствах находятся правильные значения! Т.е. в свойстве "Код инструмента" элемента, который соответствует 1-й закладке, присутствует код того инструмента, который был выбран присоздании 1-й закладки в её комбобоксе, а в свойстве "Код инструмента" элемента, соответствующего 2-й закладке, находится значение кода инструмента, выбранного на второй закладке после её создания. И в такой же манере обстоит дело при большем количестве закладок. Вот что любопытно.
    • Изменено TownSparrow 6 сентября 2013 г. 13:37
    6 сентября 2013 г. 13:35
  • Любопытно-то любопытно, а вот как бы избыть это зло. Под словом зло, я имею в виду дублирование информации, показываемой на закладках. Похоже, я что-то не то написал в разметке. Только бы вот выяснить: что и где?
    • Изменено TownSparrow 6 сентября 2013 г. 13:42
    6 сентября 2013 г. 13:39
  • Добрый день, коллега.

    У меня такое ощущение, что вы в свою коллекцию добавляете один и тот же объект.


    Алексей, извините, а вы это определили по разметке, которую я представил?
    6 сентября 2013 г. 13:43
  • Ну или сами посмотрите, или покажите тот фрагмент кода, в котором у вас добавляются новые элементы в вашу коллекцию.

    OK. Сейчас представлю... немного времени на подготовку сниппета...
    6 сентября 2013 г. 13:46
  • Это, то что касается самой коллекции Workspaces:

    Это закрытая часть:

    /// <summary>
    /// Коллекция рабочих пространств, отображаемых
    /// в главном окне приложения.
    /// </summary>
    private ObservableCollection<WorkspaceViewModel> _workspaces;

    А это - открытая:

    #region Workspaces
    
    /// <summary>
    /// Возвращает коллекцию рабочих пространств, отображаемых
    /// в главном окне приложения. Рабочее пространство - это
    /// модель представления, которая может запрашивать своё
    /// закрытие (удаление).
    /// </summary>
    public ObservableCollection<WorkspaceViewModel> Workspaces
    {
         get
         {
              // Если коллекция рабочих пространств не определена
              if (_workspaces == null)
              {
                  // Создать коллекцию рабочих пространств.
                  _workspaces = new ObservableCollection<WorkspaceViewModel>();
                  // Подписаться на обработчик события CollectionChanged для
                  // коллекции рабочих пространств.
                  _workspaces.CollectionChanged += this.OnWorkspacesChanged;
              }
                    return _workspaces;
         }
    }
    
    /// <summary>
    /// Обработчик события CollectionChanged для коллекции рабочих пространств.
    /// Для каждого нового элемента коллекции выполняет подписку на событие
    /// RequestClose "Запросить удаление". Для каждого удалённого из коллекции
    /// элемента отменяет подписку  на событие RequestClose "Запросить удаление".
    /// </summary>
    /// <param name="sender">коллекция рабочих пространств</param>
    /// <param name="e"></param>
    private void OnWorkspacesChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
         // Для каждого нового элемента в коллекции выполнить
         // подписку на событие RequestClose "Запросить удаление".
         if (e.NewItems != null && e.NewItems.Count != 0)
               foreach (WorkspaceViewModel workspace in e.NewItems)
                   workspace.RequestClose += this.OnWorkspaceRequestClose;
    
         // Для каждого удалённого из коллекции элемента отменить
         // подписку  на событие RequestClose "Запросить удаление".
         if (e.OldItems != null && e.OldItems.Count != 0)
               foreach (WorkspaceViewModel workspace in e.OldItems)
                   workspace.RequestClose -= this.OnWorkspaceRequestClose;
    }
    
    /// <summary>
    /// Обработчик события RequestClose для элемента WorkspaceViewModel.
    /// Выполняет удаление требуемого рабочего пространства из коллекции
    /// рабочих пространств при удалении вкладки из окна приложения.
    /// </summary>
    /// <param name="sender">элемент WorkspaceViewModel - инициатор события</param>
    /// <param name="e"></param>
    private void OnWorkspaceRequestClose(object sender, EventArgs e)
    {
        // Получить рабочее пространство, данные которого находятся
        // на удаляемой из окна вкладке.
        WorkspaceViewModel workspace = sender as WorkspaceViewModel;
        // Вызывается функция Dispose, определённая
        // в классе ViewModelBase, которая вызывает из себя функцию
        // OnDispose() с пустым телом, также определённую в классе ViewModelBase,
        // т.к. она вызывается относительно экземпляра WorkspaceViewModel,
        // а в этом классе функция OnDispose не переопределена.
        workspace.Dispose();
        // Удалить выбранное рабочее пространство.
        this.Workspaces.Remove(workspace);
    }
    
    #endregion // Workspaces

    А это функция создания элемента коллекции Workspace из соответствующей команды:

    /// <summary>
            /// Создаёт новое рабочее пространство, добавляет его
            /// в коллекцию рабочих пространств и делает текущим.
            /// (Используется в качестве реализации метода Execute
            /// при создании команды CreateNewFuturesTradeCommand.)
            /// </summary>
            private void CreateNewFuturesTrade()
            {
                // Создать экземпляр модели с значениями по умолчанию.
                FuturesTradeModel newFuturesTarde = FuturesTradeModel.CreateNewFuturesTradeModel();
                // На основе данных модели создать экземпляр
                // модели представления торговли фьючерсом.
                FuturesTradeViewModel workspace = new FuturesTradeViewModel(newFuturesTarde,
                    this._tradedFuturesList, this._investor.ClientCode/*, this._publisherForSendingOrders*/);
                // Добавить созданный экземпляр модели представления
                // в коллекцию рабочих пространств.
                this.Workspaces.Add(workspace);
                // Установить созданное рабочее пространство в качестве текущего.
                this.SetActiveWorkspace(workspace);
            }

    А! забыл Set ActiveWorkspace(). Вот она:

    /// <summary>
            /// Устанавливает, в коллекции рабочих пространств,
            /// переданное рабочее пространство в качестве текущего.
            /// </summary>
            /// <param name="workspace">рабочее пространство, которое требуется показать,
            /// т.е. вкладку с которым требуется открыть</param>
            private void SetActiveWorkspace(WorkspaceViewModel workspace)
            {
                // Эта строка кода выполняется только в конфигурации DEBUG.
                // Код в этой строке проверяет - содержится ли в коллекции
                // рабочих пространств указанное рабочее пространство и, если
                // содержится, то работа приложения продолжается, а если нет
                // - прерывается.
                System.Diagnostics.Debug.Assert(this.Workspaces.Contains(workspace));
    
                // Получить представление по умолчанию для коллекции рабочих пространств.
                ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.Workspaces);
                // Если представление по умолчанию для коллекции рабочих пространств получено,
                // то сделать указанное рабочее пространство текущим.
                if (collectionView != null)
                    collectionView.MoveCurrentTo(workspace);
            }

    CreateNewFuturesTrade создаёт сначала экземпляр класса модели, затем на его основе создсоздаёт класс модели представления торговли фьючерсным инструментом. В качестве параметров конструктору последнего класса передаются: экземпляр модели, список List<T> фьючерсных инструментов, назначенных к торгам в сессию и код клиента, который необходим для выставления заявок. Затем, созданный экземпляр FuturesTradeVieModel добавляется в коллекцию Workspaces и устанавливается в качестве текущего, для того, что бы в окне приложения соответствующая ему закладка была открыта. В теле конструктора класса FuturesTradeViuewModel, на основе передаваемого списка инструментов, создаётся экземпляр ObservableCollection, который доступен через открытое свойство FutSessContents. К этому свойству и привязывается свойство ItemsSource комбобокса, который находится на закладке.

    Нужен класс FuturesTradeViewModel, экземпляры которого содержит коллекция Workspaces? Если нужен, то напишите, пожалуйста, в ответе и я его вам предоставлю.








    • Изменено TownSparrow 6 сентября 2013 г. 14:41
    6 сентября 2013 г. 14:03
  • Я прошу прощения конечно, но поскольку это моё первое приложение MVVM, то я во многом повторяю архитектуру приложения Джоша Смита с его закладками на TabControl. Посчитал, что она мне подходит. Т.к. мое приложение должно параллельно торговать несколькими инструментами, то информацию по каждому торгуемому инструменту я хотел бы разместить на отдельной закладке TabControl. НО вот что-то с UI не справился. С вторника пытаюсь разобраться и всё никак.
    • Изменено TownSparrow 6 сентября 2013 г. 14:13
    6 сентября 2013 г. 14:12
  • Помещаю здесь исходный текст класса FuturesTradeViewModel. Правда пока в сокращённом виде:

    /// <summary>
    /// Класс FuturesTradeViewModel содержит свойства привязки
    /// и бизнес-логику торговли фьючерсным инструментом.
    /// В конценции паттерна MVVM, класс FuturesTradeViewModel 
    /// - это модель представления (ViewModel) торговли фьючерсом.
    /// </summary>
    class FuturesTradeViewModel : WorkspaceViewModel
        {
            #region Fields
            /// <summary>
            /// Экземпляр модели.
            /// </summary>
            private readonly FuturesTradeModel _futuresTradeModel;
            /// <summary>
            /// Справочник инструментов.
            /// </summary>
            private ObservableCollection<FutSessContentsRecord> _futSessContents;
            /// <summary>
            /// Индекс инструмента в справочнике.
            /// Default is (-1).
            /// </summary>
            private Int32 _selectedIndex = -1;
            /// <summary>
            /// Команда запуска/останова торгов.
            /// </summary>
            private RelayCommand _startStopTradingCommand;
            /// <summary>
            /// Код клиента.
            /// </summary>
            private String _clientCode;
            /// <summary>
            /// Надпись на кнопке запуска и останова торгов по выбранному инструменту.
            /// </summary>
            private String _startStopButtonContent = "Начать торги";
            #endregion // Fields
    
            #region Constructor
            /// <summary>
            /// Создаёт экземпляр FuturesTradeViewModel.
            /// </summary>
            /// <param name="futuresTradeModel">Модель</param>
            /// <param name="tradedFuturesList">Список инструментов</param>
            public FuturesTradeViewModel(FuturesTradeModel futuresTradeModel,
                List<FutSessContentsRecord> tradedFuturesList, String clientCode)
            {
                if (futuresTradeModel == null)
                    throw new ArgumentNullException("futuresTradeModel");
                if (tradedFuturesList == null)
                    throw new ArgumentNullException("tradedFuturesList");
                if (clientCode == null)
                    throw new ArgumentNullException("clientCode");
                
                // Инициализировать модель.
                _futuresTradeModel = futuresTradeModel;
                // создать справочник инструментов.
                _futSessContents = new ObservableCollection<FutSessContentsRecord>(tradedFuturesList);
                // Получить код клиента.
                _clientCode = clientCode;
            }
            #endregion // Constructor
    
            #region Commands
            /// <summary>
            /// Команда запуска останова торгов.
            /// Свойство Command кнопки запуска / останова
            /// торгов в View привязано к этому свойству.
            /// </summary>
            public ICommand StartStopTradingCommand
            {
                get
                {
                    if (_startStopTradingCommand == null)
                    {
                        _startStopTradingCommand = new RelayCommand(
                            param => this.StartStopTrading(),
                            param => this.CanStartStopTrading());
                    }
                    return _startStopTradingCommand;
                }
            }
            /// <summary>
            /// Запуск или останов торгов.
            /// </summary>
            private void StartStopTrading()
            {
                // Торги запущены.
                if (StartStopButtonContent == "Start")
                {
                    // Получить код инструм. из справочника.
                    this.IsinId = FutSessContents[_selectedIndex].IsinId;
                    // Получить цену инструм. из справочника.
                    this.LastClQuote = FutSessContents[_selectedIndex].LastClQuote;
                    // Поменять заголовок на кнопке в View.
                    StartStopButtonContent = "Stop";
                }
                else
                {
                    // Торги остановлены.
                    this.IsinId = 0;
                    StartStopButtonContent = "Start";
                }
            }
            /// <summary>
            /// Отслеживание возможности
            /// выполнить команду.
            /// </summary>
            /// <returns></returns>
            private Boolean CanStartStopTrading()
            {
                if (_selectedIndex >= 0)
                    return true;
                else
                    return false;
            }
            #endregion
    
            #region Traded Futures Properties
            /// <summary>
            /// Числовой код инструмента.
            /// </summary>
            public Int32 IsinId
            {
                get { return _futuresTradeModel.IsinId; }
                set { _futuresTradeModel.IsinId = value; }
            }
            /// <summary>
            /// Символьный код инструмента.
            /// </summary>
            public String Isin
            {
                get { return _futuresTradeModel.Isin; }
                set
                {
                    if (value == _futuresTradeModel.Isin) return;
                    _futuresTradeModel.Isin = value;
                    base.OnPropertyChanged("Isin");
                }
            }
            /// <summary>
            /// Цена инструмента.
            /// </summary>
            public Decimal LastClQuote
            {
                get { return _futuresTradeModel.LastClQuote; }
                set { _futuresTradeModel.LastClQuote = value; }
            }
            #endregion
                    
            #region Trade Properties
            /// <summary>
            /// Кол-во выставленных заявок.
            /// </summary>
            public UInt32 SentOrdersTotal
            {
                get { return _futuresTradeModel.SentOrdersTotal; }
                set
                {
                    if (value == _futuresTradeModel.SentOrdersTotal)
                        return;
                    _futuresTradeModel.SentOrdersTotal = value;
                    base.OnPropertyChanged("SentOrdersTotal");
                }
            }
            /// <summary>
            /// Ко-во сделок.
            /// </summary>
            public UInt32 DealsTotal
            {
                get { return _futuresTradeModel.DealsTotal; }
                set
                {
                    if (value == _futuresTradeModel.DealsTotal) return;
                    _futuresTradeModel.DealsTotal = value;
                    base.OnPropertyChanged("DealsTotal");
                }
            }
            #endregion // Trade Properties
    
            #region Presentation Properties
            /// <summary>
            /// Справочник инструментов. Свойство ItemsSource
            /// ComboBox'а на закладке в View привязано
            /// к этому свойству.
            /// </summary>
            public ObservableCollection<FutSessContentsRecord> FutSessContents
            {
                get
                {
                    return _futSessContents;
                }
            }
            #endregion
    
            #region Nonepresentation Properties
            /// <summary>
            /// Индекс инструмента, выбранного 
            /// в справочнике. Свойство SelectedIndex
            /// ComboBox'а на закладке в View
            /// привязано к этому свойству.
            /// </summary>
            public Int32 SelectedIndex
            {
                get { return _selectedIndex; }
                set
                {
                    if (_selectedIndex != value)
                    {
                        _selectedIndex = value;
                        if (_selectedIndex != -1)
                            this.Isin = FutSessContents[_selectedIndex].Isin;
                    }
                }
            }
            /// <summary>
            /// Надпись на кнопке запуска и останова торгов по выбранному инструменту.
            /// Свойство Content кнопки привязано к этому свойству.
            /// </summary>
            public String StartStopButtonContent
            {
                get { return _startStopButtonContent; }
                private set
                {
                    if (value == _startStopButtonContent)
                        return;
                    _startStopButtonContent = value;
                    base.OnPropertyChanged("StartStopButtonContent");
                }
            }
            #endregion
    
            #region Methods
            /// <summary>
            /// Реализация торгового алгоритма
            /// (определяет, можно ли формировать буферы заявок
            /// на покупку/продажу).
            /// </summary>
            private void CheckBoxborderCrossing(OverallOrderBook overallOrderBook)
            {
                // Некоторые вычисления . . . . .
    
                if(/*Совпали условия*/)
                {
                    // Сформировать буферы заявок.
                    ManageOrders();
                }
            }
            /// <summary>
            /// Реализация торгового алгоритма
            /// (формирует буферы заявок).
            /// </summary>
            public void ManageOrders()
            {
                // Формирование буферов заявок.
            }
            /// <summary>
            #endregion
        }

    Если нужно, то приведу логику классов WorkspaceViewModel и ViewModelBase. НО в них ничего особенного нет. Их логика в моём приложении точно такая же, как и в приложении-примере MVVM, представленным Джошем Смитом.



    • Изменено TownSparrow 7 сентября 2013 г. 13:25
    6 сентября 2013 г. 15:52
  • Ребята, ну помогите, кто-нибудь, если можете. Пожалуйста.

    20 сентября 2013 г. 15:12
  • Проблема еще актуальна? Если да, то может вы скините приложение мне на почту, и я попробую его в дебаге погонять? Сейчас почему такое может быть не вижу... У вас приложение с базой работает или только с on-line сервисами?

    23 сентября 2013 г. 11:52
    Отвечающий
  • Да, актуальна. Извините, что так задержал с ответом. Приложение работает только с on-line сервисами. Алексей, скажите, пожалуйста, вам его скинуть в том виде, в котором оно у меня сейчас (я добавил кое-какой функционал в модель представления) или в том виде, когда я открыл на форуме эту тему. Добавление функционала не усогубило и не облегчило проблему: 1) дублирование информации на закладках в дебаге и в релизе, 2) зависание при создании закладок и при переходе с одной закладки на другую в дебаге и 3) Зависание при первом (после перехода на закладку) открытии комбобокса. Она так и осталась.

    24 сентября 2013 г. 9:30
  • Кидайте как у вас сейчас есть на почту losev-al <собака> yandex.ru. Мой скайп такой же как часть почта, та что до собаки. Сегодня вечером постараюсь посмотреть.
    24 сентября 2013 г. 9:36
    Отвечающий
  • Хорошо. Алексей, только извините, пожалуйста, я выну из приложения сам торговый алгоритм. Дело в том, что его авторство принадлежит не мне, а моему приятелю, для которого я это приложение и пишу. Да, в принципе алгоритм на проблему не влияет. Что с ним, что без него - она есть. Сейчас подготовлю проект...

    С уважением Евгений.

    24 сентября 2013 г. 9:50
  • Отправил.
    24 сентября 2013 г. 11:42
  • Binding Mode=OneWayToSource - зло. Убираем, наступает счастье.

    26 сентября 2013 г. 8:43
    Отвечающий
  • OK. Вопрос решён, тема закрыта.
    26 сентября 2013 г. 11:59