2

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に配置しない場合、すべてが機能することです。可視性が更新され、正常に表示されます。

4

1 に答える 1

0

私はあなたのサンプルを試し、それを機能させるために次の変更を加えました

         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}}"

ユーザーコントロールとスタックパネルの両方で機能します。これが役立つことを願っています。

于 2012-10-25T19:24:18.463 に答える