嵌入TabControl中的自定义用户控件执行操作时更改TabControl的属性

本文关键字:TabControl 操作 属性 控件 自定义 用户 嵌入 执行 | 更新日期: 2023-09-27 18:25:03

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

我有一个主窗口,里面有一个名为TabControl1的TabControl。TabControl由2个"选项卡"组成。

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

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

为了让您了解FruitFormVegForm

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

我还有两个名为FruitValidationVegValidation验证类,它们基本上由简单的公共静态方法组成,根据输入字符串是否符合简单标准,返回true或false。例如,考虑"FruitValidation.validateApp()"方法:

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();

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

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

现在本质上这就是问题:

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

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

嵌入TabControl中的自定义用户控件执行操作时更改TabControl的属性

为了回答您的问题:最简单的方法是在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还有一个内置验证。你也应该读一下。在你最终重新发明轮子之前。