0

私はWPFフォームデザイナーに取り組んでおり、Labels、TextBox、ComboBoxなどのコントロールをデザインサーフェスにドラッグアンドドロップしてから、プロパティグリッドを介してユーザーが各コントロールのデータバインディングを設定できます。特定のプロパティにバインディングが設定されていないコントロールには、赤い背景を表示する必要があります。

私の当初のアイデアは、呼び出し元の要素自体を取得して、特定のプロパティへのバインドがあるかどうかを調べるHasBindingConverterを作成することでした。この場合TextBox.TextProperty

public class HasBindingConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        FrameworkElement fe = value as FrameworkElement;
        if(fe != null)
        {
            Binding binding = BindingOperations.GetBinding(fe, TextBox.TextProperty);
            return binding != null;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

次に、TextBoxコントロールタイプに関連付けられたスタイルを、フォームのResourcesセクションに追加しました。これはUserControlです。

<UserControl.Resources>
    <Style TargetType="TextBox">
        <Style.Resources>
            <Converters:HasBindingConverter x:Key="HasBindingConv"/>
        </Style.Resources>
        <Style.Triggers>
            <DataTrigger
            Binding="{Binding,
            RelativeSource={RelativeSource Self},
            Converter={StaticResource HasBindingConv}}"
            Value="False">
                <Setter Property="TextBox.Background" Value="Red" />
                </DataTrigger>
 <DataTrigger Binding="{Binding 
            RelativeSource={RelativeSource Self},
            Converter={StaticResource HasBindingConv}}"
            Value="True">
                <Setter Property="TextBox.Background" Value="White" />
        </Style.Triggers>
    </Style>

したがって、TextBoxにTextBox.TextPropertyのデータバインディングが設定されていない場合は、背景が赤に設定されます。この部分は正常に機能します。問題は、ユーザーがこのコントロールのTextBox.TextPropertyバインディングを設定すると、Converterが再度呼び出されないため、背景が赤のままになることです。

このコントロールのバインディングを設定した後、トリガーを呼び出す方法を知っている人はいますか?または他の提案、私は間違った方法で問題に取り組んでいる可能性があります。

ありがとう!

4

2 に答える 2

1

これが発生する理由は、ソースが作成されるとそれ自体が変更されることはないBindingため、ソースとして再度呼び出されることはないためです。TextBox

あなたがに集中していると仮定しますTextBox

  1. したがって、コンテナ(Window/ UserControl)のTagプロパティを現在のコントロールに設定します。

    myWindow.Tag = FocusManager.GetFocusedElement(myWindow);
    
  2. これでトリガーを変更しますBinding

    <DataTrigger
        Binding="{Binding,
        Path=Tag,
        RelativeSource={RelativeSource AncestorType=Window},
        Converter={StaticResource HasBindingConv}}" .. >
    
  3. Tagのプロパティを更新しますWindow

    myWindow.Tag = null;
    myWindow.Tag = FocusManager.GetFocusedElement(myWindow);
    
于 2012-10-25T14:19:52.720 に答える
0

この問題を解決する別の方法を見つけました。

ControlHasBindingBehavior Attachedプロパティを作成し、最初はfalseに設定しました。

public class ControlHasBindingBehavior
{
    #region DependencyProperty HasBinding

    /// <summary>
    /// Registers a dependency property as backing store for the HasBinding property
    /// Very important to set default value to 'false'
    /// </summary>
    public static readonly DependencyProperty HasBindingProperty =
        DependencyProperty.RegisterAttached("HasBinding", typeof(bool), typeof(ControlHasBindingBehavior),
        new FrameworkPropertyMetadata(false,FrameworkPropertyMetadataOptions.AffectsRender));

    /// <summary>
    /// Gets or sets the HasBinding.
    /// </summary>
    /// <value>The HasBinding.</value>
    public static bool GetHasBinding(DependencyObject d)
    {
        return (bool)d.GetValue(HasBindingProperty);
    }

    public static void SetHasBinding(DependencyObject d, bool value)
    {
        d.SetValue(HasBindingProperty, value);
    }

    #endregion
}

次に、FormDesignerビューで、すべてのTextBoxのスタイルとトリガーを作成したので、Textboxの「HasBinding」添付プロパティがfalseの場合、背景が赤に変わります。

        <Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Behaviors:ControlHasBindingBehavior.HasBinding" Value="False">
                <Setter Property="Background" Value="Red"/>
            </Trigger>
        </Style.Triggers>
    </Style>

最後に、ユーザーが特定のコントロールのバインディングを正常に設定したら、Attachedプロパティを「True」に設定します。

                ControlHasBindingBehavior.SetHasBinding(SelectedObject,true);

これが発生すると、TextBox.Backgroundが再び白に変わります:)最初は、スタイルトリガーをすべてのUIElements、FrameworkElements、またはControlsに一般的な方法で適用したかったのですが、このスレッドではこれは不可能のようです。

誰かがそれが役に立つと思うことを願っています

于 2012-11-02T13:13:59.143 に答える