2008-09-16 23 views
18

WPF UserControls geliştirirken, bir alt denetimin DependencyProperty UserControl DependencyProperty olarak ortaya çıkarmak için en iyi yolu nedir? Aşağıdaki örnek, bir TextBox'un Text özelliğini bir UserControl içinde nasıl göstereceğimi gösterir. Elbette bunu başarmak için daha iyi/daha basit bir yol var mı? Biz doğrusu UserControl adlandırma ve UserControl'ın adıyla özelliklerini başvurarak, RelativeSource arama olmadan, bizim takımda yapıyoruz nasılExpose DependencyProperty

<UserControl x:Class="WpfApplication3.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="LightCyan"> 
     <TextBox Margin="8" Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
    </StackPanel> 
</UserControl> 


using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication3 
{ 
    public partial class UserControl1 : UserControl 
    { 
     public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new PropertyMetadata(null)); 
     public string Text 
     { 
      get { return GetValue(TextProperty) as string; } 
      set { SetValue(TextProperty, value); } 
     } 

     public UserControl1() { InitializeComponent(); } 
    } 
} 

cevap

17

.

<UserControl x:Class="WpfApplication3.UserControl1" x:Name="UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="LightCyan"> 
     <TextBox Margin="8" Text="{Binding Path=Text, ElementName=UserControl1}" /> 
    </StackPanel> 
</UserControl> 

Bazen kendimizi olsa çok şey UserControl en yapım bulduk ve çoğu kez bizim kullanımını azalttılar. Ayrıca, PART_TextDisplay veya bir şeylerin satırları boyunca bu metin kutusu gibi şeyleri adlandırma geleneğini de takip ediyorum, böylece gelecekte şablonun aynısını kaldırabileceksiniz.

+0

Bu benim için çalışan hayır 'FindAncestor' –

+0

olduğu yerde bu şekilde ancak senin gibi görünmüyor, Silverlight 4 en iyi şekilde çalışır Aynı x: Class' ve x: Name' kullanın. WpfApplication1.SliderLabel gibi bir sınıfa sahip olmalı ve SliderLabelControl gibi bir isim verdim. Aksi takdirde ismin zaten var olduğundan şikayetçi oldu. –

1

DataContext'i bunun için UserControl yapıcısında ayarlayabilirsiniz, daha sonra yalnızca yolla bağlanın.

CS:

DataContext = this; 

XAML:

<TextBox Margin="8" Text="{Binding Text} /> 
+1

bu sadece sınırlı bir ölçekte çalışır. Gerçekten bir veri dosyasına ihtiyacınız varsa –