Подтвердить что ты не робот

Загрузка и сохранение компоновки привязок - привязка видимости

Я столкнулся с проблемой, что я не могу открыть привязку типа X после загрузки моего старого макета. Это происходит только тогда, когда я закрыл привязку типа X до сохранения макета.

У кого-то есть аналогичная проблема с AvalonDock? Это ошибка AvalonDock? После нескольких лет отладки я опасаюсь, что привязка <Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/> не будет правильно обновляться в представлении при изменении IsActive в ViewModel. Ответственность за эту задачу несет AvalonDock. Но, может быть, проблема заключается в загрузке и сохранении макета?

Код

Просмотр

Я загружаю сохраненный макет моих привязок (= окна инструментов) в Loaded Событие моего DockingManager в моем представлении как это (упрощенное)

string savedLayout = Properties.Settings.Default.Layout;
XmlDocument doc = new XmlDocument();
doc.LoadXml(savedLayout);

// very simplified code. load saved xml layout and add anchorables to the dockmanager
doc.SelectNodes("//LayoutAnchorable").OfType<XmlNode>().ToList().ForEach(anchorable =>
{
    this.DockManager.AnchorablesSource.Add(anchorable);
});

Я сохраняю текущий макет моих привязок в Closing Событие моего MainWindow в моем представлении (упрощенное):

XmlDocument doc = new XmlDocument();
XmlLayoutSerializer xmlLayoutSerializer = new XmlLayoutSerializer(this.DockManager);

using (MemoryStream stream = new MemoryStream())
{
    xmlLayoutSerializer.Serialize(stream);
    stream.Seek(0, SeekOrigin.Begin);
    doc.Load(stream);
}
// here happens some magic. i think this code is not responsible for my problem
Properties.Settings.Default.Layout = doc.OuterXml;

ViewModel привязан к ViewModel в XAML, как это (упрощенно):

<xcad:DockingManager x:Name="DockManager" AnchorablesSource="{Binding Tools}" Loaded="DockManager_Loaded">
    <xcad:DockingManager.LayoutItemContainerStyle>
        <Style TargetType="{x:Type dockctrl:LayoutItem}">
            <Setter Property="Title" Value="{Binding Model.ContentId}" />
            <Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}" />
            <Setter Property="CanClose" Value="{Binding Model.CanClose, Mode=TwoWay}" />
            <Setter Property="Visibility" Value="{Binding Model.IsVisible, Mode=TwoWay, Converter={StaticResource Bool2vis}, ConverterParameter={x:Static Visibility.Hidden}}"/>
            <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}" />
            <Setter Property="IconSource" Value="{Binding Model.IconSource}" />
            <Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/>
            <Setter Property="ContentId" Value="{Binding Model.ContentId}" />
        </Style>
    </xcad:DockingManager.LayoutItemContainerStyle>
[...]

ViewModel

Якорь открывается в ViewModel MainWindow. Вот пример кода для сообщений:

public ObservableCollection<ToolBoxViewModelBase> Tools { get; } = new ObservableCollection<ToolBoxViewModelBase>();

public MainWindowViewModel()
{
    // [...]
    this.MessagesWindow = new MessagesWindowViewModel();
    SimpleIoc.Default.Register<MessagesWindowViewModel>(() => this.MessagesWindow);
    this.ShowMessagesWindowCommand = new RelayCommand(() => this.OpenToolBox(this.MessagesWindow));
    // [...]
}

public void OpenToolBox<T>(T viewModel) where T : ToolBoxViewModelBase
{
    // [...]
    viewModel.IsVisible = true;
    viewModel.IsActive = true;
    // [...]
}

Просто дайте мне знать, если вам нужна дополнительная информация или я пропустил, чтобы добавить код!

4b9b3361