1

問題:ソリューション全体で使用できるように、親グリッドにいくつかのテレリック コントロールを持つ新しく作成された UserControl があります。シンプルに聞こえますよね?私は UserControl を作成しました。クラス My.Project.Controls.Tool を呼び出しましょう。これを名前空間xmlns:Controls="clr-namespace:My.Project.Controls;assembly=My.Project.GlobalUserControlDump"で別のビューに呼び出して、便利なダンディ インテリセンスから簡単に選択してビューに設定しようとしました。

これは期待どおりです。私の 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に、コントロールに含まれる値を設定します。

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