Привязка в окне 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, так и для стека. Надеюсь, что это может помочь.