1

所以,想象一下情况......

我有一个 MainWindow,其中放置了一个 TabControl,Apadtly 命名为 TabControl1。TabControl 由 2 个“选项卡”组成。

第一个选项卡包含我的一个自定义用户控件FruitForm的实例化,这个特定的实例化名为FruitForm1

同样,第二个选项卡包含我的另一个自定义用户控件VegForm的实例,这个特定的实例被命名为VegForm1

为了让您对FruitFormVegForm的外观有一个印象,我附上了以下图片:

我没有足够的代表在我的问题中嵌入图像:(

我还有 2 个名为FruitValidationVegValidation的验证类,它们本质上由简单的公共静态方法组成,这些方法根据输入字符串是否与简单标准匹配而返回 true 或 false。例如,考虑“ FruitValidation.validateApple() ”方法:

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

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

我还有一个静态IconLoader类,它本质上是一个包装器,它允许我轻松地将所需图标的源属性更改为TickCross。例如,如果我想将 Banana 文本框(见上图)旁边的图标更改为Tick,那么我将编写以下代码:

imageBanana.Source = IconLoader.GetTick();

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

每次在特定文本框中更改文本时,我都会验证文本框的内容是否与所需值匹配。如果是这样,我将图标设置为Tick,否则将显示Cross

这张图片应该澄清我在上一段中描述的内容。

现在基本上这是一个问题:

当对应的 UserControl 中的所有文本框都有效时(即每个 TextBox旁边都有一个 Tick),如何将在标题中找到的图像更改为Tick ?我还希望从当前不知道TabControl1存在的UserControl中触发此特定事件

我还应该指出,如果其中一个文本字段变得无效(在某个点曾经有效之后),则相应的 Tab 标题应该反映这一点 - 通过显示 Cross

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>

但是,如果您的目标是学习 wpf - 您应该在它带您走得更远之前摆脱这种Windows.Forms心态。因为通常您不需要此代码。阅读几篇关于 WPF 中 MVVM 模式的文章是一个好的开始。

WPF 还有一个内置验证。你也应该阅读它。在你最终重新发明轮子之前。

于 2013-07-25T09:32:20.467 回答