构建后消失UserControl

时间:2012-12-07 21:26:14

标签: c# silverlight xaml user-controls caliburn.micro

问题:我有一个新制作的UserControl,在父网格中有几个telerik控件,可以在整个解决方案中使用它。听起来很简单吧?我创建了UserControl,让我们调用Class My.Project.Controls.Tool,然后我尝试使用命名空间xmlns:Controls="clr-namespace:My.Project.Controls;assembly=My.Project.GlobalUserControlDump"调用另一个View,然后通过从方便的dandy intellisense中轻松选择在视图中设置它。

这正如预期的那样,我的UserControl出现在设计器的单独视图中就好了。所以我采取下一个正常的步骤并构建它......一旦构建完成(它没有按预期报告没有错误就好了)这个小虫子消失了! xaml当然仍然在视图中,但是它已经从设计器中消失了并且它没有出现在构建的解决方案上?

困惑我回去,快速更改UserControl,然后它出现在设计器中。好吧,我认为它必定是一些侥幸所以我再次构建它......它再次从设计师和构建的解决方案中消失了?

现在我可以继续可靠地重现这种情况。对UserControl进行一些更改,它会重新出现在设计器中.....然后构建它并再次消失!

有人可以对这个quandry有所了解吗?使用Caliburn Micro在SL中运行(在浏览器内外,但内置在浏览器中)。任何对这个谜团的见解当然都非常感激,希望另一双眼睛能够抓住我的愚蠢。干杯!

对于澄清,这就是用户控件中与a previous question直接相关的内容。

<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>

然后我会直接在一个视图上调用(它将作为命名空间显示在GlobalUserControlDump项目中)并且一旦将命名空间添加到View中,它就会在intellisense中按预期显示正常;

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

感谢您一看,我目前仍然难过。

2 个答案:

答案 0 :(得分:4)

您在UserControl的构造函数中缺少对InitializeComponent()的调用。

答案 1 :(得分:1)

我相信您发布的代码中的命名空间不正确。

通过更改new PropertyMetadata(null));属性,不会注册回调。没有它,我相信绑定将不起作用。您要做的是绑定到usercontrol上的属性,当绑定值更改时,您需要在控件中包含的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;
        }
    }
}