2010-08-17 53 views
5

我有一個自定義的DependencyProperty用戶控件。當我在DataTemplate中使用UserControl時,我無法設置DependencyProperty的值。如果我直接在窗口中使用UserControl,那麼DependencyProperty可以正常工作。我爲這篇長文章道歉,我將代碼簡化到了最低限度,但仍然顯示了我在項目中遇到的問題。感謝您的幫助,我不知道還有什麼可以嘗試的。當在DataTemplate中使用控件時,爲什麼UserControl中的自定義屬性未設置?

主窗口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> 

主窗口代碼:

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

    public TextVM TheTextVM { get; set; } 
} 

用戶控件XAML:

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

用戶控件代碼:

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(); 
    } 
} 

回答

2

我可以重現這個問題,但我不知道是什麼原因造成的......顯然,如果您從構造函數中刪除初始化,它就會起作用。如果默認值是常量,那麼最好的選擇是將其用作依賴屬性的默認值,而不是將其設置在構造函數中。

無論如何,你想要做什麼?難道不能通過綁定ViewModel來實現嗎?

+0

非常感謝!我沒有想到構造函數中的初始化。在我的情況下,屬性是一個時間戳,我希望實例在創建對象時具有默認值,而不是在發生靜態屬性註冊時。但是這個屬性無論如何都會綁定到一個虛擬機,所以現在我只是在虛擬機中初始化它。這會做現在,但仍然讓我感到困惑,將控件放入窗口並將其放入DataTemplate中。順便說一下,如果在構造函數中初始化MyText,則將MyText綁定到VM將顯示相同的問題。 – Carlos 2010-08-19 16:27:48

+0

您應該在MSDN論壇上發佈您的問題,以便MS的某個人可以回答。我認爲這種行爲可能是一個錯誤 – 2010-08-19 16:34:49

+0

http://msdn.microsoft.com/en-us/library/ms754209.aspx – SLaks 2011-06-29 13:05:42

相關問題