编码嵌套方法的正确方法是什么?

时间:2011-11-26 19:27:22

标签: c# silverlight function

我在silverlight 4中创建了一个注册表单,其中我有大量的文本框,在每个文本框的前面我放置了一个文本块作为必填字段验证器,当任何文本框留空时在失去焦点的同时,放在它前面的文本块必须变成红色。

文本框名为textbox1,textbox2 ...以及文本块

问题是,我不希望代码为每个特定文本框的具体方法,我想要做的只是在两个三个方法中完成这个

这里我做了一些似乎不正确的编码

    private void textBox_LostFocus(object sender, RoutedEventArgs e)
    {
        var textBox = (TextBox) sender;
        if (textbox.Text == "")
           { 
               var textblock = "textblock" +  textBox.Name.Remove(0,7);
               TextblockColorChange(textblock);
           }
    }
    private void TextblockColorChange(object sender)
    {
         var textblock = (TextBlock) sender;
         textblock.Foreground= new SolidColorBrush(Colors.Red);
    }

请建议一些更好的方法。

4 个答案:

答案 0 :(得分:2)

我创建一个包含TextBlock和TextBox的UserControl,并在目前拥有TextBlock和TextBox组合的任何地方使用此UserControl。然后,此Usercontrol将在其中包含LostFocus逻辑并相应地更新TextBlock。这样可以防止需要确定要更新的控件的正确名称。

答案 1 :(得分:1)

虽然我实际上更喜欢Bills方法(虽然我倾向于使用模板控制),但这是另一种非常有趣的选择。在你的xaml中使用这种标记: -

 <TextBlock Text="Enter Value 1" Foreground="{Binding Tag, ElementName=textBox1, TargetNullValue=Black}" />
 <TextBox x:Name="textBox1" LostFocus="txt_LostFocus" />

您的常见txt_LostFocus可能如下所示: -

    private void txt_LostFocus(object sender, RoutedEventArgs e)
    {
        TextBox txt = ((TextBox)sender);
        if (String.IsNullOrEmpty(txt.Text))
        {
            txt.Tag = new SolidColorBrush(Colors.Red);
        }
        else
        {
            txt.Tag = null;
        }
    }

答案 2 :(得分:1)

你需要这样的东西,

XAML部分:

<Grid x:Name="LayoutRoot" Background="White">
    <StackPanel Orientation="Horizontal" Height="25">
        <TextBox Width="150" LostFocus="TextBox_LostFocus"/>
        <TextBlock Text="*" Foreground="#FF0000" VerticalAlignment="Center" Margin="10,0,0,0" Visibility="Collapsed"/>
    </StackPanel>
</Grid>

C#Part:

        private void TextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        var textbox = sender as TextBox;
        if(textbox == null) return;

        var stackPanel = textbox.Parent as StackPanel;
        if(stackPanel == null) return;

        var textBlock = stackPanel.Children.Where(a => a is TextBlock).FirstOrDefault();
        if (textBlock == null) return;
        if (string.IsNullOrEmpty(textbox.Text)) textBlock.Visibility = Visibility.Visible;
        else textBlock.Visibility = Visibility.Collapsed;
    }

答案 3 :(得分:0)

var textblock = "textblock" +  textBox.Name.Remove(0,7);
TextblockColorChange(textblock);

上面的代码只会将字符串发送到TextblockColorChange()

您没有显示任何其他代码,但我猜您要在将结果传递给代码之前对该字符串执行FindControl或FindControl搜索。