簡體   English   中英

WPF中的已加載事件和數據綁定

[英]Loaded event and data-binding in WPF

假設我們有一個帶有依賴項屬性的控件:

 public class MyControl : ContentControl
{

    static MyControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl)));
    }


    void DoSomething(object sender, RoutedEventArgs e)
    {
        //...

    }

    public MyControl()
    {           
        this.Loaded += DoSomething;
    }

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value", typeof(string), typeof(MyControl),
        new FrameworkPropertyMetadata(default(string),
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, OnValueChanged));


    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        //some actions              
    }

    public string Value
    {
        get { return (string)GetValue(MyControl.ValueProperty); }
        set { SetValue(MyControl.ValueProperty, value); }
    }}

在XAML中的某個地方,我們將ValueProperty綁定到某個ViewModel的某個屬性Val。

我的問題是,在引發Loaded事件時,是否將MyControl.Value的值設置為它具有或不具有的Val的值? 那么,是否可以在加載或不加載MyControl的DoSomething方法中使用Val?

預先感謝您的任何回答。

public class MyControl : ContentControl
{
    public MyControl()
    {           
        this.Loaded += (s,e) => DoSomething();
    }

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var c = (MyControl)d;
        if ( c.IsLoaded )
            c.DoSomething();              
    }

    // this will be called only if the control is loaded
    private void DoSomething()
    {
        var value = Value;
        if ( value == null )
        {
            ...
        } else if ( value == string.Empty )
        {
            ...
        } else
        {
        }
    }

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value", typeof(string), typeof(MyControl),
        new FrameworkPropertyMetadata(default(string),
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, OnValueChanged));

    public string Value
    {
        get { return (string)GetValue(MyControl.ValueProperty); }
        set { SetValue(MyControl.ValueProperty, value); }
    }

    static MyControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl)));
    }

}

我的問題是,在Loaded事件時,是否將MyControl.Value的值設置為它具有或不具有的Val的值?

您不能依靠它。 Loaded事件不是“數據綁定已完成”事件。 同樣,依賴項屬性的值可以隨時更改,並且對Value屬性進行任何更改的位置都在OnValueChanged回調中。 如果要執行以下操作,可以檢查控件是否已加載到回調中:

private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyControl ctrl = d as MyControl;
    if (ctrl.IsLoaded)
    {
        //...
    }
}

關鍵是您應該執行任何依賴於回調中而不是Loaded事件處理程序中依賴項屬性值的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM