我有一個自定義的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();
}
}
非常感謝!我沒有想到構造函數中的初始化。在我的情況下,屬性是一個時間戳,我希望實例在創建對象時具有默認值,而不是在發生靜態屬性註冊時。但是這個屬性無論如何都會綁定到一個虛擬機,所以現在我只是在虛擬機中初始化它。這會做現在,但仍然讓我感到困惑,將控件放入窗口並將其放入DataTemplate中。順便說一下,如果在構造函數中初始化MyText,則將MyText綁定到VM將顯示相同的問題。 – Carlos 2010-08-19 16:27:48
您應該在MSDN論壇上發佈您的問題,以便MS的某個人可以回答。我認爲這種行爲可能是一個錯誤 – 2010-08-19 16:34:49
http://msdn.microsoft.com/en-us/library/ms754209.aspx – SLaks 2011-06-29 13:05:42