2012-08-23 22 views
3

好吧,我想我在这里失去了一些东西。是不是Xaml打破我的封装?

可以说,在Winforms应用程序中我有一个Form和一个UserControl。然后,我将一个按钮添加到UserCntrol,然后将UserControl添加到窗体。现在Button被添加到UserControl中作为私人成员,直到UserControl通过公共属性公开它的私人成员,Form就不应该访问Button。

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.testUserControl1. 
} 

您将无法从表单的代码中找到UserControl的按钮。从封装的角度来看,我认为这正是我们想要的。

现在让我们说,我在WPF应用程序中使用Window和UserControl做同样的事情。我通过Xaml向UserControl添加一个Button,然后将UserControl添加到窗口。但是现在我可以从Window的代码访问Button。

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.testUserControl1.button1.Content = "What the HELL!"; 
} 

如果我通过代码,而不是XAML中添加一个按钮,我还要把它变成私有的机会。但“通过代码声明构建用户界面,不是” - 这不就是Xaml在那里的原因吗?那么是不是打破了封装的概念?

编辑:我知道我们大多数人,包括我自己,用MVVM来开发WPF应用程序,你不需要从你的代码隐藏是指你的UI元素。但问题的背景仍然存在,对吗?我经常构建可重用的UserContolr(而不是像MVVM中的View),将它们用作视觉元素,其中我通常不需要使用UserControl的代码隐藏。

+1

从来没有注意到这一点,然后再次,我几乎从来没有命名我的控件,我几乎从来没有在Windows或用户控件后面的代码。 –

+0

@ H.B .:请看编辑 – atiyar

回答

3

我不确定你在说什么。你可以使按钮在XAML并将它是私有的,以及:

<Button x:FieldModifier="private" x:Name="Whatever" Content="This is a button" /> 

你不必通过代码来做到这一点。只是它默认为(我认为)internal而不是private。但是像H.B.说,我很少说出我的控制,所以我没有遇到这个问题。

+0

,正如我在我的问题开始时提到的那样:“我想我错过了什么”。我不知道存在'x:FieldModifier'属性。 +1。非常感谢 – atiyar

+0

[根据MSDN](http://msdn.microsoft.com/en-us/library/aa970905.aspx),您只能使用该指令通过使用'public'作为值使字段更易于访问。 –

+0

@ H.B .:所以'private'对'x:FieldModifier'来说不是一个有效值?但它的作品! – atiyar