文件更改事件在控件加载时触发,需要防止加载?

时间:2012-10-13 11:41:12

标签: wpf textbox

在我创建了一个控件,它有一个文本框和一个附加了文本更改的事件处理程序 - 这是在xaml中。

问题:当加载控件时,文本更改事件被触发,我不希望它在加载控件时发生,只有当我通过键入内容实际对控件进行更改时才会加载。

你的专业建议我做什么? :)

3 个答案:

答案 0 :(得分:3)

您需要做的就是在处理事件处理程序之前检查文本框的IsLoaded属性。

答案 1 :(得分:0)

在构造函数中的InitializeComponent方法之后,不在Xaml中附加您的EventHandler。

public MainWindow()
{
    InitializeComponent();
    textBox1.TextChanged+=new TextChangedEventHandler(textBox1_TextChanged);
}

我注意到你在谈论一个用户控件,我唯一想到的就是创建一个属性,可以用来禁止TextChanged事件,直到父窗体完成加载。看看这样的东西是否有效。

MainForm Xaml:

<my:UserControl1 setInhibit="True"   HorizontalAlignment="Left" Margin="111,103,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="55" Width="149" setText="Hello" />

MainForm CS

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    userControl11.setInhibit = false;
}

用户控件:

public UserControl1()
{
    InitializeComponent();
    textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
}

public string setText
{
    get { return textBox1.Text; }
    set { textBox1.Text = value; }
}
public bool setInhibit { get; set; }
void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    if (setInhibit) return;
    // Do your work here
}

答案 2 :(得分:0)

UserControl1.xaml:

<Grid>
    <TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged"/>
</Grid>

其中TextChanged是TextBox的原始事件

UserControl1.xaml.cs:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        _isFirstTime = true;
        DataContext = this;
        InitializeComponent();
    }

    public event TextChangedEventHandler TextBoxTextChanged;
    bool _isFirstTime;

    //MyText Dependency Property
    public string MyText
    {
        get { return (string)GetValue(MyTextProperty); }
        set { SetValue(MyTextProperty, value); }
    }
    public static readonly DependencyProperty MyTextProperty =
        DependencyProperty.Register("MyText", typeof(string), typeof(UserControl1), new UIPropertyMetadata(""));

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (TextBoxTextChanged != null)
            if (!_isFirstTime)
            {
                TextBoxTextChanged(sender, e);
            }
        _isFirstTime = false;
    }
}

其中TextBox_TextChanged是原始TextChanged的自定义eventHandler 和TextBoxTextChanged更像是原始TextChanged的包装器

Window.xaml:

<Grid>
    <c:UserControl1 TextBoxTextChanged="TextBoxValueChanged"/>
</Grid>

如您所见,您可以将eventHandler添加到事件包装器(TextBoxTextChanged)

Window.xaml.cs:

private void TextBoxValueChanged(object sender, TextChangedEventArgs e)
{
    MessageBox.Show("asd");
}

最后Text TextValueChanged将在第一次更改Text时被触发