1

では、状況をイメージして...

私は MainWindow を持っており、その中にTabControl1 という名前の TabControlが配置されています。TabControl は 2 つの「タブ」で構成されています。

最初のタブには、カスタム ユーザー コントロールの 1 つであるFruitFormのインスタンス化が含まれています。この特定のインスタンス化にはFruitForm1という名前が付けられています。

同様に、2 番目のタブには、カスタム ユーザー コントロールの別のVegFormのインスタンスが含まれています。この特定のインスタンスはVegForm1という名前です。

FruitFormVegFormがどのように見えるかの印象を与えるために、次の画像を含めました。

質問に画像を埋め込むのに十分な担当者がいません:(

また、 FruitValidationVegValidationという名前の 2 つの Validation クラスがあります。これらは基本的に、入力文字列が単純な基準に一致するかどうかに応じて true または false を返す単純な public static メソッドで構成されています。たとえば、" FruitValidation.validateApple() " メソッドを考えてみましょう:

public static bool validateApple(string apple)
    {
        if (apple == null) return false;

        if (apple.ToUpper() == "APPLE") return true;
        else return false;
    }

また、基本的にはラッパーである静的なIconLoaderクラスもあります。これにより、目的のアイコンのソース プロパティをTickまたはCrossに簡単に変更できます。たとえば、Banana テキストボックス (上の画像を参照) の横にあるアイコンをTickに変更したい場合は、次のコードを記述します。

imageBanana.Source = IconLoader.GetTick();

//setting it back to a cross...
imageBanana.Source = IconLoader.GetCross();

特定のテキストボックス内でテキストが変更されるたびに、テキストボックスの内容が目的の値と一致するかどうかを検証します。そうでない場合は、アイコンをTickに設定します。それ以外の場合は、 Crossが表示されます。

この画像は、前の段落で説明したことを明確にするはずです。

今本質的にこれは質問です:

対応する UserControl 内のすべてのテキスト ボックスが有効な場合 (つまり、すべての TextBox の横にTickがある場合)、ヘッダー内の画像をTickに変更するにはどうすればよいですか? また、現在TabControl1 の存在を認識していない UserControl 内からこの特定のイベントをトリガーしたいと考えています。

また、テキストフィールドの 1 つが無効になった場合 (ある時点で有効になった後)、対応するタブヘッダーがこれを反映する必要があることも指摘する必要があります-クロスを表示することによって

4

1 に答える 1

0

あなたの質問に答えるには、最も簡単な方法は、検証結果を示す依存関係プロパティを UserControls に定義し、タブ項目をそれにバインドすることです。例えば:

public static readonly DependencyProperty IsValidProperty = DependencyProperty.Register("IsValid", typeof (bool), typeof (VegForm));
public bool IsValid
{
    get { return (bool) GetValue(IsValidProperty); }
    set { SetValue(IsValidProperty, value); }
}

<TabItem>
    <TabItem.Header>
        <Image>
            <Image.Style>
                <Style TargetType="Image">
                    <!-- Replace "..." with valid "tick" image source -->
                    <Setter Property="Source" Value="..."/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsValid, ElementName=VegForm}" Value="False">
                            <!-- Replace "..." with valid "cross" image source -->
                            <Setter Property="Source" Value="..."/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
    </TabItem.Header>
    <VegForm x:Name="VegForm"/>
</TabItem>

Windows.Formsただし、目標が wpf を学習することである場合は、先に進む前にこの考え方を取り除く必要があります。通常、このコードは必要ないためです。WPF の MVVM パターンに関するいくつかの記事を読むことは、良い出発点です。

また、WPFには組み込みの検証があります。あなたもそれを読んでください。車輪の再発明を終える前に。

于 2013-07-25T09:32:20.467 に答える