2010-08-17 32 views
5

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

Trả lời

2

Tôi có thể tái tạo vấn đề, nhưng tôi không biết nguyên nhân gây ra nó ... Rõ ràng nó hoạt động nếu bạn loại bỏ việc khởi tạo từ các nhà xây dựng. Nếu giá trị mặc định là hằng số, tùy chọn tốt nhất của bạn là sử dụng nó làm giá trị mặc định của thuộc tính phụ thuộc, thay vì đặt nó trong hàm tạo.

Dù sao, bạn đang cố làm gì chính xác? Nó không thể đạt được bằng một ràng buộc trên ViewModel?

+0

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

+0

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 –

+0

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

Các vấn đề liên quan