绑定到自定义控件属性

时间:2011-10-02 02:40:16

标签: c# wpf dependency-properties

我正在开发一个帐户列表下拉控件,该控件将在我的应用程序中使用。下拉列表将调用服务并检索可用帐户列表,并在下拉列表中显示所选项目的属性“SelectedAccount”。 SelectedAccount将成为DependencyProperty,因为它必须由AccountDropdown控件的使用者绑定,并且必须是双向可绑定的,因此它反映了现有的SelectedAccount。

AccountDropdown.asmx很简单,它包含一个ComboBox:

<ComboBox SelectedItem="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"...

组合框的选定项目绑定到注册为

的属性
DependencyProperty.Register("SelectedAccount", typeof(IAccount), typeof(AccountDropdown),
                                new UIPropertyMetadata(null));

......和通常的财产:

    #region SelectedAccount

    /// <summary>
    /// Selected account
    /// </summary>
    public IAccount SelectedAccount
    {
        get { return (IAccount)GetValue(SelectedAccountProperty); }
        set { SetValue(SelectedAccountProperty, value); }
    }
    #endregion SelectedAccount

属性在代码隐藏文件中定义...数据上下文设置为“this”...因此绑定设置正确。

当我使用此控件时,我需要将SelectedAccount绑定到另一个视图的ViewModel的属性,例如:

<Controls:AccountDropdown SelectedAccount="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

当我运行上面的代码,并且我在下拉列表中更改选择时,我得到一个System.StackOverflow异常。我甚至无法调试它,从Windows.Base.dll抛出异常。

我一直在努力争取这一天......任何帮助都会受到赞赏。

**注意:**我已经编写了几个带有依赖属性的WPF控件,它们工作正常,但是当我使用它们时,我在.asmx文件中显式提供了值。在这种情况下,当我使用属性时,我再次绑定。我猜测暴露一个可绑定的属性可能需要一些额外的技巧。

2 个答案:

答案 0 :(得分:1)

好的,通常情况下,解决方案很简单。 AccountDropdown控件的DataContext被隐式设置为自身,因此是无限循环。只需指定DataContext即可使用控件的DataContext(因此使用预期的ViewModel绑定):

<Controls:AccountDropdown DataContext="{Binding}" SelectedAccount="{Binding Path=SelectedAccount, Mode=TwoWay}" />

我仍然需要弄清楚如何告诉控件使用容纳它的控件的数据上下文...如果我弄清楚,我会在这里发布...或者如果你们中的任何人都知道请详细说明。

再次感谢那些回复的人。

答案 1 :(得分:0)

我想SelectedAccountChanged方法会更新字段,从而导致无限递归,从而导致堆栈溢出。

要测试:从DependencyProperty.Register调用中删除SelectedAccountChanged以确保这是错误的来源,然后检查方法本身。

如果你需要帮助,可以在那里发布方法。