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 が既に定義されていることを今のところ無視します。ウィンドウのコンテンツを削除し、これら 2 つの特定のコントロール (1 つは私が定義し、もう 1 つはスタック パネル) をロードすると、ProvideValue に設定されたブレーク ポイントが 2 回ヒットします (1 回は各コントロール)、ただし、私のカスタム コントロールでは、Convert は 1 回だけ呼び出されます。その結果、カスタム コントロールは適切に表示されますが、スタック パネルは表示されません。2 つのコントロールのバインディングのパスが同じであり、カスタム コントロールで機能するため、バインディング自体が機能していると確信しています。一方では変換が発生し、他方では発生しない違いが何であるかを理解できません (または、おそらく、StackPanel に適切にバインドされていない理由)。ヘルプ?
編集
価値があるのは、ウィンドウからコンテンツを削除して新しいTabItemに配置しない場合、すべてが機能することです。可視性が更新され、正常に表示されます。