1

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

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

困惑我回去,对 UserControl 进行快速更改,它会重新出现在设计器中。好的,我认为这一定是侥幸,所以我再次构建它......它又从设计师和构建的解决方案中消失了?

现在我可以继续可靠地重现这种情况。对 UserControl 稍作改动,它会重新出现在设计器中……然后构建它,它又会消失!

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

为了澄清,这是用户控件中与前一个问题直接相关的内容

<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 项目中,如名称空间所示),一旦将名称空间添加到视图中,它就会按预期在智能感知中显示良好;

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

感谢您的查看,我目前仍然很难过。

4

2 回答 2

5

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

于 2012-12-12T20:31:06.297 回答
1

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

通过new PropertyMetadata(null));更改属性,未注册回调。没有它,我相信绑定将不起作用。您要做的是绑定到用户控件上的属性,并且当绑定值更改时,您希望设置RadDateTimePicker控件中包含的值。

xml:

    <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;
        }
    }
}
于 2012-12-12T22:54:11.553 回答