2010-08-17 9 views
5

Özel bir DependencyProperty olan bir UserControl var. UserControl'ü bir DataTemplate içinden kullandığımda, DependencyProperty değerini ayarlayamıyorum. UserControl'ü doğrudan bir pencerede kullanırsam, DependencyProperty düzgün çalışır. Uzun gönderi için özür dilerim, kodu projemde hala sorunu gösteren minimum düzeye getirdim. Herhangi bir yardım için teşekkürler, başka ne denemem gerektiğini bilmiyorum.Denetim bir DataTemplate'de kullanıldığında neden bir UserControl içindeki özel özellik ayarlanmadı?

Ana Pencere XAML:

<Window ...> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type local:TextVM}"> 
      <local:TextV MyText="I do not see this"/> <!--Instead I see "Default in Constructor"--> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <Border BorderThickness="5" BorderBrush="Black" Width="200" Height="100" > 
      <StackPanel> 
       <ContentControl Content="{Binding Path=TheTextVM}"/> 
       <local:TextV MyText="I see this"/> 
      </StackPanel> 
     </Border> 
    </Grid> 
</Window> 

Ana Pencere Kodu:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     TheTextVM = new TextVM(); 
    } 

    public TextVM TheTextVM { get; set; } 
} 

UserControl XAML:

<UserControl ...> 
    <Grid> 
     <TextBlock x:Name="textBlock"/> 
    </Grid> 
</UserControl> 

UserControl Kodu:

public partial class TextV : UserControl 
{ 
    public TextV() 
    { 
     InitializeComponent(); 
     MyText = "Default In Constructor"; 
    } 

    public static readonly DependencyProperty MyTextProperty = 
     DependencyProperty.Register("MyText", typeof(string), typeof(TextV), 
     new PropertyMetadata("", new PropertyChangedCallback(HandleMyTextValueChanged))); 

    public string MyText 
    { 
     get { return (string)GetValue(MyTextProperty); } 
     set { SetValue(MyTextProperty, value); } 
    } 

    private static void HandleMyTextValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) 
    { 
     TextV tv = d as TextV; 
     if(tv != null) tv.textBlock.Text = args.NewValue.ToString(); 
    } 
} 

cevap

2

Sorunu yeniden üretebilirim ancak neyin neden olduğu hakkında hiçbir fikrim yok ... Görünüşe göre, başlatıcıyı yapıcıdan kaldırırsanız çalışır. Varsayılan değer sabitse, en iyi seçeneğiniz onu yapıcıda ayarlamak yerine, bağımlılık özelliğinin varsayılan değeri olarak kullanmaktır.

Neyse, tam olarak ne yapmaya çalışıyorsunuz? ViewModel'de bir bağlanma ile sağlanamadı mı?

+0

Çok teşekkürler! Kurucudaki başlatmayı düşünmedim. Benim durumumda, özellik bir zaman damgasıdır ve statik özellik kaydı gerçekleştiğinde değil, nesne oluşturulduğunda varsayılan değere sahip olmasını istedim. Ancak bu özellik zaten bir VM'ye bağlı, bu yüzden şimdi bunu VM'de başlatacağım. Bu şimdi için yapacak, ama yine de kontrol pencerede koyarak ve DataTemplate içine koyarak arasındaki farka şaşırıyor. Bu arada, MyText'in VM'ye bağlanması, MyText'in yapıcıda başlatılması durumunda aynı sorunu gösterir. – Carlos

+0

Sorunu muhtemelen MSDN forumlarında göndermelisiniz, böylece MS'den bir kişi cevap verebilir. Bu davranış bir hata olabilir düşünüyorum –

+0

http://msdn.microsoft.com/en-us/library/ms754209.aspx – SLaks

İlgili konular