2012-12-07 3 views
1

문제 : 부모 그리드의 몇 가지 컨트롤을 사용하여 새로 만든 UserControl을 사용하여 솔루션 전체에서 사용할 수 있습니다. 충분히 간단하게 들리는가? UserControl을 만들었고 My.Project.Controls.Tool 클래스를 호출 한 다음 다른 네임 스페이스 xmlns:Controls="clr-namespace:My.Project.Controls;assembly=My.Project.GlobalUserControlDump"을 호출 한 다음 편리한 dandy intellisense에서 쉽게 선택하여 뷰에 설정하려고했습니다.빌드 후 사라지는 UserControl

이것은 예상대로 내 UserControl은 디자이너의 별도 뷰에 잘 나타납니다. 그래서 다음 정상적인 단계를 밟아 빌드를 완료하자마자 빌드가 완료되면 (예상대로 오류가보고되지 않고 정상적으로 작동하는 경우) 작은 놈이 사라집니다. xaml은 여전히 ​​뷰에 있지만 디자이너로부터 사라졌으며 빌드 된 솔루션에 표시되지 않습니다.

혼란 나는 다시, UserControl을 신속하게 변경하고 다시 디자이너에 나타납니다. 좋아요, 다시 생각하기에 우연이라고 생각합니다 .... 그리고 다시 디자이너와 솔루션에서 사라집니다.

이제이 시나리오를 안정적으로 재현 할 수 있습니다. UserControl을 약간 변경하면 디자이너에 다시 나타납니다 ..... 빌드하고 다시 사라집니다!

누군가이 quandry에 약간의 빛을 비춰 줄 수 있습니까? Caliburn Micro를 사용하여 SL에서 실행 (브라우저 안팎에 있지만 브라우저로 작성). 이 수수께끼에 대한 통찰력은 물론 다른 한 쌍의 눈이 내 어리 석음을 잡기를 바라면서 크게 감사하게 생각합니다. 건배!

명확화를 위해 사용자 콘트롤에 직접 적용되는 것은 a previous question입니다. 그때 (그것은 네임 스페이스 쇼와 GlobalUserControlDump 프로젝트에 앉아 것)와 네임 스페이스가보기에 추가되면, 그것은 예상대로 인텔리에 잘 나타나 같은 뷰를 직접 호출 할 것이다

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    mc:Ignorable="d" 
    x:Class="My.Project.Controls.DatePicker"> 

    <Grid Width="90"> 
      <telerik:RadDateTimePicker 
             InputMode="DatePicker" 
             SelectedDate="{Binding SelectedDate, Mode=TwoWay}"/> 
      <telerik:RadMaskedDateTimeInput 
              IsClearButtonVisible="False" 
              FormatString="{}{0:M/d/yy}" 
              SelectionOnFocus="SelectAll" 
              Value="{Binding SelectedDate, Mode=TwoWay}"/> 
    </Grid> 
</UserControl> 

;

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro" 
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    x:Class="My.Project.Views.RandomView" 
    xmlns:Controls="clr-namespace:My.Project.Controls;assembly=My.Project.GlobalUserControlDump" 
    mc:Ignorable="d"> 

    <Grid> 
      <Controls:DatePicker /> 
    </Grid> 
</UserControl> 

그런 다음 필요한 속성을 노출하고 있습니다.

namespace My 
{ 
    public partial class DatePicker : UserControl 
    { 
     public static readonly DependencyProperty SelectedDateProperty = 
      DependencyProperty.Register("SelectedDate", typeof(DateTime), typeof(DatePicker), new PropertyMetadata(null)); 

     public DatePicker() 
     { 
      // Required to initialize variables 
      DataContext = this; 
     } 

     public DateTime SelectedDate 
     { 
      get { return (DateTime)GetValue(SelectedDateProperty); } 
      set { SetValue(SelectedDateProperty, value); } 
     } 
    } 
} 

나는 아직도 저주를 받았습니다.

+0

- 당신이 당신의 XAML을 게시 할 수 있습니다 단지 같은 것을 배제하기 위해, 나는 Telerik 스위트를 제어 한 too – Charleh

+0

당신은 아직 이것을 알아 냈습니까? –

+0

UC에 대한 전체 XAML 및 UC가있는보기에 대한 일부 XAML을 게시 할 수 있습니다 ('ContentControl' 및 규칙을 사용하여 바인딩하거나 UC를보기에 직접 놓는 것입니까?) – Charleh

답변

1

게시 한 코드의 네임 스페이스가 잘못되었다고 생각합니다.

new PropertyMetadata(null));으로 변경된 콜백이 등록되지 않았습니다. 그것 없이는 바인딩이 작동하지 않을 것입니다. 당신이하고자하는 것은 사용자 정의 컨트롤의 속성에 바인딩하는 것이고 바운드 값이 변경되면 컨트롤에 포함 된 RadDateTimePicker의 값을 설정하려고합니다.

는 XAML : 뒤에

<Grid Width="90"> 
     <telerik:RadDateTimePicker x:Name="MyRadDateTimePicker" InputMode="DatePicker" /> 
    <telerik:RadMaskedDateTimeInput x:Name="MyRadMaskedDateTimeInput" 
            IsClearButtonVisible="False" 
            FormatString="{}{0:M/d/yy}" 
            SelectionOnFocus="SelectAll" /> 
    </Grid> 
</UserControl> 

코드 : 전에 것을 본 적이

using System; 
using System.Windows; 

namespace SO 
{ 
    public partial class MyDatePicker 
    { 
     public MyDatePicker() 
     { 
      InitializeComponent(); 
     } 

     public const string SelectedDatePropertyName = "SelectedDate"; 

     public DateTime SelectedDate 
     { 
      get { return (DateTime)GetValue(SelectedDateProperty); } 
      set { SetValue(SelectedDateProperty, value); } 
     } 

     public static readonly DependencyProperty SelectedDateProperty = DependencyProperty.Register(
      SelectedDatePropertyName, 
      typeof(DateTime), 
      typeof(MyDatePicker), 
      new PropertyMetadata(DateTime.Now, OnSelectedDatePropertyChanged)); 

     private static void OnSelectedDatePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ((MyDatePicker)d).MyRadDateTimePicker.SelectedDate = (DateTime) e.NewValue; 
      ((MyDatePicker)d).MyRadMaskedDateTimeInput.Value = (DateTime)e.NewValue; 
     } 
    } 
} 
+0

데 렉 데릭, 스크럼에서 보자. ;) –

+0

바인딩이 실패하여 컨트롤이 보이지 않는 이유는 무엇입니까? 또한 null 메타 데이터를 설정하면 종속성 속성에 대한 모든 바인딩이 손상된다고 생각하지 않습니다. 모든 것을 삭제하고 코드를 사용하여 수정 된 다른 문제가있었습니다. 나는 InitializeComponent()에 대한 호출이 있었는지 아니면 c & p에서의 에러인지에 대한 나의 대답에 대한 응답을 얻지 못했다. –

+0

기본 바인딩 값에 대해 DateTime 형식을 null로 설정하면 보이는 문제가없는 것으로 보입니다. OP 코드를 사용하면 데이터 바인딩이 어떻게 올바르게 작동하는지 잘 모르겠습니다. –

4

UserControl의 생성자에서 InitializeComponent()에 대한 호출이 없습니다.

+0

제 생성자 중 하나에서 InitializeComponent()를 잊어 버렸다고 믿을 수 없습니다. 빠른 수정에 대해 감사드립니다. – Sgr3005