Tôi có một UserControl có một tùy chỉnh DependencyProperty
. Khi tôi sử dụng UserControl từ bên trong một DataTemplate
, tôi không thể đặt giá trị của DependencyProperty
. Nếu tôi sử dụng UserControl trực tiếp trong một cửa sổ, thì DependencyProperty
hoạt động tốt. Tôi xin lỗi vì bài đăng dài, tôi đã đơn giản hóa mã ở mức tối thiểu vẫn hiển thị sự cố tôi có trong dự án của mình. Cảm ơn bạn đã giúp đỡ, tôi không biết những gì khác để thử.Tại sao thuộc tính tùy chỉnh trong UserControl không được đặt khi điều khiển được sử dụng trong DataTemplate?
Main Window 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>
Main Window Code:
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 Code:
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();
}
}
Cảm ơn rất nhiều! Tôi không nghĩ về việc khởi tạo trong constructor. Trong trường hợp của tôi, thuộc tính là một tem thời gian và tôi muốn cá thể có giá trị mặc định khi đối tượng được tạo và không phải khi đăng ký thuộc tính tĩnh xảy ra. Nhưng tài sản đó là ràng buộc với một VM anyway, vì vậy bây giờ tôi sẽ chỉ khởi tạo mà trong VM. Điều này sẽ làm cho bây giờ, nhưng vẫn còn cho tôi bối rối như sự khác biệt giữa đặt kiểm soát trong cửa sổ và đặt nó trong DataTemplate. Bằng cách này, ràng buộc MyText với VM cho thấy cùng một vấn đề, nếu MyText được khởi tạo trong hàm tạo. – Carlos
Bạn có lẽ nên đăng câu hỏi của bạn trên diễn đàn MSDN, để ai đó từ MS có thể trả lời. Tôi nghĩ hành vi này có thể là lỗi –
http://msdn.microsoft.com/en-us/library/ms754209.aspx – SLaks