寻找编写复杂WPF UI的更好方法

寻找编写复杂WPF UI的更好方法,wpf,xaml,user-controls,Wpf,Xaml,User Controls,我继承的WPF应用程序包含大量XAML,其模式如下: <Window ...> <Grid> <z:SomeUserControl> <z:AnotherUc> <Label /> <Button /> <ComboBox /> </z:AnotherUc> <z:An

我继承的WPF应用程序包含大量XAML,其模式如下:

<Window ...>
    <Grid>
        <z:SomeUserControl>
            <z:AnotherUc>
                <Label /> <Button /> <ComboBox />
            </z:AnotherUc>
            <z:AnotherUc>
                <Label /> <Button /> <ComboBox />
            </z:AnotherUc>
        </z:SomeUserControl>
    </Grid>
</Window>

换句话说,我们有按UserControl分组的UI部分,通常嵌套在其他UserControl中。在某些情况下,内容是使用基本WPF内容控件定义的

我们试图解决的问题是,由于WPF的臭名昭著的限制,x:Name属性无法应用于任何最内部的控件:

这带来了一个问题,因为代码隐藏需要能够引用UserControls中的元素。选择UserControls对UI的各个部分进行分组,是因为默认控件的所有样式和模板都过于笨重,而且标记很快就变成了可怕的、不可读的混乱


然而,如果微软无意解决这个所谓的“限制”,那么必须找到更好的方法。考虑已被放置在使用CS+外部XAML模板文件中,如
GaryGJohnson
在connect站点上的解决方案所示。然而,这有一种sphagetti的感觉,任何中断绑定的事情都是不可能的。

这里最好的选择通常是避免在那些“内部”元素上使用代码隐藏。您仍然可以使用数据绑定,因此将这些绑定到DataContext中的属性将正常工作

当然,另一种选择是直接将标签/按钮/组合框作为
另一个uc
类的依赖属性公开。这将允许您将它们直接用作UserControl的成员,从而避免了范围问题


当然,这样做的缺点是,您必须为特定的元素组合自定义用户控件,而不是允许在其中放置任何控件。

从设计上看,这听起来像是一团糟。您可以创建自己的AttachedProperty-MyNameProperty,在XAML中设置它,并编写自己的逻辑/可视树帮助器,这将对它起作用。我并不是说我会这么做,但如果你需要一个快速的解决方法(彻底重新设计你的UI组合模型),那可能就行了

如果你能发布一些松散的xaml,我可以分享我的想法。您在上面发布的一个似乎是ItemsControl的一个很好的候选项-即,具有公共UI元素的重复项可以作为ItemsControl项考虑。我遇到了类似的问题,并使用了CustomControl项。但现在我知道一切都可以通过MVVM和行为来完成。所以我尽量避免使用x:Name属性。