Привязка в окне WPF работает только при удалении содержимого из окна.

У меня странная ситуация, когда у меня есть привязка с конвертером в окне WPF. Иногда содержимое этого окна удаляется из указанного окна и вставляется в окно с вкладками следующим образом:

        public void AddNewTab(Window wpfWindow, String tabTitle, OnFocusHandler onFocusHandler)
    {
        //Unhook window contents
        object content= wpfWindow.Content;
        wpfWindow.Content = null;

        //Create a new tab
        TabItem newTab = new TabItem();
        newTab.Header = title;

        newTab.Style = (Style)Resources["CorsairTab"];

        //newTab.Foreground = Brushes.White;
        newTab.Background = Brushes.Transparent;
        newTab.Content = content;

        //Add it
        TabControl.Items.Add(newTab);

        //Tie handler if it exists
        if (onFocusHandler != null)
            _listOnTabSelectedEventHandlers.Add(onFocusHandler);
        else
            _listOnTabSelectedEventHandlers.Add(null);

        //If this is the first tab, make it the opened one
        if(TabControl.Items.Count == 1)
            TabControl.SelectedIndex = 0;
    }

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

[ValueConversion(typeof(bool), typeof(Visibility))]
public class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool isWorking = (bool)value;
        if (isWorking)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

}

И XAML, который ссылается на это, выглядит так:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="1" Visibility="{Binding Path=IsEye, Converter={inf:BoolToVisibilityConverter}}">
    <TextBlock Text="Working Eye" VerticalAlignment="Top" Foreground="White" Margin="5,5,0,0"/>
    <Button Content="Approve All" Command="{Binding ApproveAllTrades}" 
                        Margin="5,0,0,0" Width="auto" Height="auto" VerticalAlignment="Top" Background="#DCDCDC"/>
 </StackPanel>
 <views:OrdersWorkingEyeView Loaded="EyeOrders_Loaded" Grid.Column="1" Grid.Row="2" Visibility="{Binding Path=IsEye, Converter={inf:BoolToVisibilityConverter}}"/>

Не обращая внимания на момент, что BoolToVisibility уже является определенной вещью, когда я убираю окно его содержимого и загружаю эти два конкретных элемента управления (один определен мной, а другой - панель стека), точка прерывания, установленная в ProvideValue, дважды срабатывает (один раз для каждый элемент управления), но Convert вызывается только один раз, для моего пользовательского элемента управления. В результате пользовательский элемент управления имеет правильную видимость, а панель стека - нет. Я почти уверен, что сама привязка работает, поскольку путь для привязок на двух элементах управления одинаков и работает для настраиваемого элемента управления. Я не могу понять, в чем разница, которая вызывает преобразование для одного, а не для другого (или, возможно, почему оно не связывается должным образом для StackPanel). Помогите?

РЕДАКТИРОВАТЬ

Что бы это ни стоило, все работает, когда я не убираю контент из окна и не помещаю его в новый TabItem. Видимости обновляются и отображаются нормально.

1 ответ

Я попробовал ваш образец и внес следующие изменения, чтобы он работал

         private bool _isEye= true;

        public bool IsEye
        {
            get { return _isEye; }
            set { _isEye = value;
            NotifyFropertyChanged("IsEye");
            }
        }

Определить ресурсы

<Window.Resources>
    <!-- local is your namespace--> 
    <local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
</Window.Resources>

обновить привязку

Visibility="{Binding Path=IsEye,Converter={StaticResource BoolToVisibilityConverter}}"

и это работает как для usercontrol, так и для стека. Надеюсь, что это может помочь.

Другие вопросы по тегам