2012-04-17 35 views
6

Khi bạn có một usercontrol trong wpf nó có thể tiếp cận bên ngoài với các phần tử cha của nó không? Ví dụ, điều khiển người dùng của tôi chỉ liệt kê một số thứ chung chung được giữ bên trong điều khiển được đóng gói trong một dockpanel trên cửa sổ chính, nhưng tôi có một hộp văn bản và nút trong cửa sổ chính mà tôi muốn truy cập từ điều khiển ... điều này có thể không?UserControl sử dụng các phần tử cha trong wpf?

Nó sẽ giúp tôi tiết kiệm rất nhiều thời gian hơn là thay đổi nội dung của toàn bộ cửa sổ và hiển thị cùng một hộp văn bản/nút trong mọi điều khiển người dùng. Nếu bất cứ ai có một ví dụ về điều này nó sẽ được nhiều đánh giá cao.

+0

Took một cái nhìn lúc này - bạn đã thử truy cập vào các yếu tố cha mẹ với DataBinding và RelativeSource của tổ tiên? Đây là một [SO trả lời] tốt (http://stackoverflow.com/questions/84278/how-do-i-use-wpf-bindings-with-relativesource) nếu có. Nếu điều đó không có vẻ giống như một giải pháp tốt, bạn có thể muốn đăng một chút mã để minh họa vấn đề. Chúc mừng – Berryl

Trả lời

3

Có thể và đây là một số mã tôi đã sử dụng để soạn các bản trình bày ra khỏi UserControls có DP.

Tôi không thích nó một chút, nhưng nó hoạt động. Tôi cũng nghĩ rằng đây là chủ đề tuyệt vời tuyệt vời và có thể một số mã sẽ giúp nhận được một số câu trả lời hay hơn!

Chúc mừng,
Berry

UserControl XAML

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

UserControl Mã Đằng sau

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 

} 

enter image description here

Một UserControl cho thấy phần

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

enter image description here

+1

Câu hỏi đơn giản, câu trả lời WTF. –

+1

@Berryl +10 trả lời! Nỗ lực tuyệt vời và cảm ơn bạn! –

+1

@KendallFrey. Nó không phải là * mà * đơn giản khi bạn nghĩ về nó, nhưng nếu nó là để bạn chỉ cần đăng một số mã đơn giản và rõ ràng để làm cho trường hợp của bạn. – Berryl

3

Mẫu thiết kế tốt hơn là để người dùng điều chỉnh thông báo (qua sự kiện) cửa sổ chính khi cần thay đổi và hỏi cửa sổ (thông qua phương pháp) khi cần thông tin. Bạn sẽ, ví dụ, có một phương thức GetText() trên cửa sổ mà usercontrol có thể gọi, và một sự kiện ChangeText trên usercontrol mà cửa sổ sẽ đăng ký.

Ý tưởng là luôn luôn kiểm soát cửa sổ. Sử dụng tâm lý này sẽ giúp bạn dễ dàng hơn trong việc phát triển các ứng dụng trong tương lai.

+0

Vì vậy, sử dụng ví dụ của bạn nếu bạn đã có một hộp văn bản và nút làm thế nào bạn sẽ gửi văn bản đến usercontrol và sau đó cư điều khiển đó với văn bản trên nút bấm? –

+0

Tạo một phương thức trên usercontrol (nói, 'SetText (chuỗi văn bản)'). Trong 'button1_Click', gọi' myUserControl.SetText (myTextBox.Text) '.Trong phương thức 'SetText' trong usercontrol, bạn có thể làm bất cứ điều gì bạn muốn cư trú dữ liệu trong usercontrol. –

2

Để trả lời câu hỏi của bạn: có, bạn có thể truy cập kiểm soát của phụ huynh thông qua liên kết RelativeSource hoặc thông qua thành viên chính trong mã sau. Nhưng một câu trả lời tốt hơn là tương tự như câu trả lời @KendallFrey. Áp dụng một khung như Light MVVM và sử dụng lớp messenger hoặc sử dụng các sự kiện theo cách mà Kendall mô tả.

Các vấn đề liên quan