WPF ComboBox SelectedItem, установленный в NULL на переключателе TabControl

Вместо создания контроллера данных контроллера я бы предложил создать экземпляр контроллера данных и передать его. Чтобы поддерживать инъекцию зависимостей, я бы сначала создал протокол DataController:

protocol DataController {
    var someInt : Int {get set} 
    var someString : String {get set}
}

Тогда я бы создал SpecificDataController (или любое другое имя в настоящее время было бы подходящим) class:

class SpecificDataController : DataController {
   var someInt : Int = 5
   var someString : String = "Hello data" 
}

Класс ViewController должен иметь поле для удерживания dataController. Обратите внимание, что тип dataController - это протокол DataController. Таким образом, легко отключить реализации контроллера данных:

class ViewController : UIViewController {
   var dataController : DataController?
   ...
}

В AppDelegate мы можем установить viewController dataController:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    if let viewController = self.window?.rootViewController as? ViewController {
        viewController.dataController =  SpecificDataController()
    }   
    return true
}

. Когда мы переходим к другому viewController мы можем передать dataController в:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    ...   
}

Теперь, когда мы хотим отключить контроллер данных для другой задачи, мы можем сделать это в AppDelegate и не нужно менять любой другой код, который использует контроллер данных.

Это, конечно, излишне, если мы просто хотим передать одно значение. В этом случае лучше всего пойти с ответом nhgrif.

При таком подходе мы можем разделить вид логической части.

18
задан bsg 10 August 2010 в 05:05
поделиться

3 ответа

мы просто столкнулись с той же проблемой. Мы нашли запись в блоге, описывающую проблему. Похоже, что это ошибка в WPF и есть обходной путь: Укажите привязку SelectedItem до привязки ItemsSource, и проблема должна быть устранена.

Ссылка на статью блога:

http://www.metanous.be/pharcyde/post/Bug-in-WPF-combobox-databinding.aspx

21
ответ дан 30 November 2019 в 08:21
поделиться

У меня была такая же проблема при прокрутке виртуализации DataGrid, содержащей ComboBox es. Использование IsSynchronizedWithCurrentItem не сработало и не изменило порядок привязок SelectedItem и ItemsSource. Но вот уродливый хак, который, кажется, работает:

Во-первых, дайте вашему ComboBox и x:Name. Это должно быть в XAML для элемента управления с одним ComboBox. Например:

<ComboBox x:Name="mComboBox" SelectedItem="{Binding SelectedTarget.WritableData, Mode=TwoWay}">

Затем добавьте эти два обработчика событий в свой код:

using System.Windows.Controls;
using System.Windows;

namespace SATS.FileParsing.UserLogic
{
    public partial class VariableTargetSelector : UserControl
    {
        public VariableTargetSelector()
        {
            InitializeComponent();
            mComboBox.DataContextChanged += mComboBox_DataContextChanged;
            mComboBox.SelectionChanged += mComboBox_SelectionChanged;
        }

        /// <summary>
        /// Without this, if you grab the scrollbar and frantically scroll around, some ComboBoxes get their SelectedItem set to null.
        /// Don't ask me why.
        /// </summary>
        void mComboBox_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            mComboBox.GetBindingExpression(ComboBox.SelectedItemProperty).UpdateTarget();
        }

        /// <summary>
        /// Without this, picking a new item in the dropdown does not update IVariablePair.SelectedTarget.WritableData.
        /// Don't ask me why.
        /// </summary>
        void mComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            mComboBox.GetBindingExpression(ComboBox.SelectedItemProperty).UpdateSource();
        }
    }
}
0
ответ дан 30 November 2019 в 08:21
поделиться

Однажды у меня была похожая проблема. Кажется, что поле со списком теряет выбранный элемент в событии VisibilityChanged. Решение - очистить привязку до того, как это произойдет, и сбросить ее при возврате. Вы также можете попробовать установить привязку в Mode = TwoWay

Надеюсь, что это поможет

Янв

0
ответ дан 30 November 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: