当你在wpf中有一个usercontrol时,它可以到达其父元素的外部吗?例如,我的用户控件只列出了控件内部的一些通用的东西,这些东西被封装在主窗口的dockpanel中,但我在主窗口中有一个文本框和按钮,我想从控件中访问...这可能吗?
它可以节省很多时间,而不是更改整个窗口的内容,并在每个用户控件中显示相同的文本框/按钮。如果有人有这方面的例子,我将不胜感激。
答案 0 :(得分:3)
更好的设计模式是让usercontrol在需要更改某些内容时通知(通过事件)主窗口,并在需要某些信息时询问窗口(通过方法)。例如,您可以在usercontrol可以调用的窗口上使用GetText()方法,并在窗口将订阅的usercontrol上使用ChangeText事件。
我们的想法是始终控制窗口。使用这种心态将使您以后更容易开发应用程序。
答案 1 :(得分:3)
是的,这是可能的,这里有一些我用来编写具有DP的UserControl的演示文稿的代码。
我甚至不爱它,但它确实有效。我也认为这是一个伟大的主题,也许一些代码可以帮助我们找到更好的答案!
干杯,
浆果
<Button x:Name="btnAddNewItem" Style="{StaticResource blueButtonStyle}" >
<StackPanel Orientation="Horizontal">
<Image Source="{resx:Resx ResxName=Core.Presentation.Resources.MasterDetail, Key=bullet_add}" Stretch="Uniform" />
<Label x:Name="tbItemName" Margin="5" Foreground="White" Padding="10, 0">_Add New [item]</Label>
</StackPanel>
</Button>
public partial class AddNewItemButton : UserControl
{
...
#region Item Name
public static readonly DependencyProperty ItemNameProperty = DependencyProperty.Register(
"ItemName", typeof(string), typeof(AddNewItemButton),
new FrameworkPropertyMetadata(OnItemNameChanged));
public string ItemName
{
get { return (string)GetValue(ItemNameProperty); }
set { SetValue(ItemNameProperty, value); }
}
public string ButtonText { get { return (string) tbItemName.Content; } }
private static void OnItemNameChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
// When the item name changes, set the text of the item name
var control = (AddNewItemButton)obj;
control.tbItemName.Content = string.Format(GlobalCommandStrings.Subject_Add, control.ItemName.Capitalize());
control.ToolTip = string.Format(GlobalCommandStrings.Subject_Add_ToolTip, control.ItemName);
}
#endregion
#region Command
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
"Command", typeof(ICommand), typeof(AddNewItemButton),
new FrameworkPropertyMetadata(OnCommandChanged));
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
private static void OnCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
// When the item name changes, set the text of the item name
var control = (AddNewItemButton)obj;
control.btnAddNewItem.Command = control.Command;
}
#endregion
}
<UserControl ...
xmlns:uc="clr-namespace:Smack.Core.Presentation.Wpf.Controls.UserControls"
>
<DockPanel LastChildFill="True">
...
<uc:AddNewItemButton x:Name="_addNewItemButton" Margin="0,0,10 0" DockPanel.Dock="Right" />
...
</DockPanel>
</UserControl>
答案 2 :(得分:2)
回答你的问题:是的,你可以通过RelativeSource绑定或通过后面代码中的Parent成员访问父控件。但更好的答案类似于@KendallFrey的回答。采用类似Light MVVM的框架,并使用其信使类或以肯德尔描述的方式使用事件。