Вместо создания контроллера данных контроллера я бы предложил создать экземпляр контроллера данных и передать его. Чтобы поддерживать инъекцию зависимостей, я бы сначала создал протокол 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.
При таком подходе мы можем разделить вид логической части.
мы просто столкнулись с той же проблемой. Мы нашли запись в блоге, описывающую проблему. Похоже, что это ошибка в WPF и есть обходной путь: Укажите привязку SelectedItem до привязки ItemsSource, и проблема должна быть устранена.
Ссылка на статью блога:
http://www.metanous.be/pharcyde/post/Bug-in-WPF-combobox-databinding.aspx
У меня была такая же проблема при прокрутке виртуализации 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();
}
}
}
Однажды у меня была похожая проблема. Кажется, что поле со списком теряет выбранный элемент в событии VisibilityChanged. Решение - очистить привязку до того, как это произойдет, и сбросить ее при возврате. Вы также можете попробовать установить привязку в Mode = TwoWay
Надеюсь, что это поможет
Янв