Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已在WPF中加载事件和数据绑定_C#_Wpf_Data Binding - Fatal编程技术网

C# 已在WPF中加载事件和数据绑定

C# 已在WPF中加载事件和数据绑定,c#,wpf,data-binding,C#,Wpf,Data Binding,假设我们有一个具有依赖属性的控件: public class MyControl : ContentControl { static MyControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl))); } void DoSomething(object send

假设我们有一个具有依赖属性的控件:

 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的值

你不能相信这一点。加载的
事件不是“数据绑定已完成”事件。此外,依赖项属性的值可以随时更改,处理
属性更改的位置位于
OnValueChanged
回调中。如果要执行以下操作,可以检查是否已在回调中加载控件:

private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyControl ctrl = d as MyControl;
    if (ctrl.IsLoaded)
    {
        //...
    }
}
关键是,您应该执行任何操作,这取决于回调中的依赖项属性值,而不是加载的
事件处理程序中的依赖项属性值

我的问题是,在触发
Loaded
事件时,MyControl.value的值是否已经设置为Val的值

你不能相信这一点。加载的
事件不是“数据绑定已完成”事件。此外,依赖项属性的值可以随时更改,处理
属性更改的位置位于
OnValueChanged
回调中。如果要执行以下操作,可以检查是否已在回调中加载控件:

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

关键是,您应该根据回调中而不是加载的
事件处理程序中的dependency属性的值执行任何操作。

尝试它不是更容易吗?;)我试过了,但没有发现什么是错误的,在某些情况下它有效(值已设置),在另一些情况下它无效,我无法理解它所依赖的是什么,或者我遗漏了什么,所以我决定询问是否存在任何已定义的行为以及它所依赖的是什么。请不要吝啬,我只是问,我花了一整天的时间试图弄明白这一点,并进行调试。我不想显得吝啬,但你已经尝试过的信息对试图帮助你的人来说很重要。我不明白为什么设置哪个值才重要。该值可以是null、空或其他字符串,并且可以随时更改。您必须随时处理所有这些值。我可以想象一个小的时间跨度,在这个时间跨度内,您可能需要对其进行不同的处理:控件已构建,但尚未加载,并且值发生了变化。尝试它不是更容易吗?;)我试过了,但没有发现什么是错误的,在某些情况下它有效(值已设置),在另一些情况下它无效,我无法理解它所依赖的是什么,或者我遗漏了什么,所以我决定询问是否存在任何已定义的行为以及它所依赖的是什么。请不要吝啬,我只是问,我花了一整天的时间试图弄明白这一点,并进行调试。我不想显得吝啬,但你已经尝试过的信息对试图帮助你的人来说很重要。我不明白为什么设置哪个值才重要。该值可以是null、空或其他字符串,并且可以随时更改。您必须随时处理所有这些值。我能想到一个小的时间跨度,你可能不得不用不同的方式来处理它:控件被构造,但尚未加载,并且值发生了变化。是的,我理解你的观点。在我的情况下,数据是从ViewModel加载的,需要检查其有效性,如果数据无效,我需要执行其他操作。所以我需要定义一个时刻,当我的控件的所有属性都被适当地设置时,为了检查它,我认为当控件被加载时,也就是属性已经被设置的时候,因为文档说,当加载被触发时,所有绑定都被完成了(但是没有提到它们被设置的问题)。。。因此,现在,装载可以;不可信赖,我是以另一种方式实现的。你可以在每个依赖属性回调中设置一个布尔标志,然后在设置完所有标志后调用“Complete”方法或其他方法。是的,我理解你的观点。在我的情况下,数据是从ViewModel加载的,需要检查其有效性,如果数据无效,我需要执行其他操作。所以我需要定义一个时刻,当我的控件的所有属性都被适当地设置时,为了检查它,我认为当控件被加载时,也就是属性已经被设置的时候,因为文档说,当加载被触发时,所有绑定都被完成了(但是没有提到它们被设置的问题)。。。因此,现在,装载可以;不必依赖,我正在以另一种方式实现它。您可以在每个依赖属性回调中设置一个布尔标志,然后在设置完所有标志后调用“Complete”方法或其他方法。谢谢您的回答,我只需要执行一些数据验证,以便在决定加载控件时向用户显示什么之前执行某些操作,因此我需要的正是显示控件之前的时刻,但所有属性都已设置好。。。我想可能是在加载事件之后。谢谢你的回答,我只需要执行一些数据验证,以便在决定加载控件时向用户显示什么之前执行某些操作,所以我需要的正是控件显示之前的时刻,但所有属性都已设置好。。。我想可能是在加载事件之后。