1

にはLongListSelector、次のように複数のアイテムが表示されていますDataTemplate

<TextBlock Text="{Binding Subject}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
<StackPanel Orientation="Horizontal">
    <TextBlock Text="Last modified :" Margin="15, 0, 5, 0" Foreground="LightGray" Style="{StaticResource PhoneTextNormalStyle}"/>
    <TextBlock Text="{Binding LastModified}" Foreground="#989696" Style="{StaticResource PhoneTextNormalStyle}"/>
 </StackPanel>

この時点で、すべてが正常に機能し、MVVM とバインディングは問題ありません。

UserControlこの XAML を に移動し、そこからそれらのプロパティをバインドしたいと考えました。そして、私はこのように進めようと考えました:

<UserControl x:Class="..."
    xmlns=" ... "
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="100" d:DesignWidth="480">

    <StackPanel x:Name="LayoutRoot" Background="Transparent">
        <TextBlock x:Name="TitleTextBlock"  Style="{StaticResource PhoneTextExtraLargeStyle}" />
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Last modified :" Margin="15, 0, 5, 0" Foreground="LightGray" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="LastModifiedDateTextBlock" Foreground="#989696" Style="{StaticResource PhoneTextNormalStyle}"/>
        </StackPanel>
    </StackPanel>
</UserControl>

そして、これは C# クラスです:

public partial class LongListSelectorItemControl
{
    private DateTime _lastModifiedDate;

    public string Title
    {
        get
        {
            return TitleTextBlock.Text;
        }
        set
        {
            TitleTextBlock.Text = value;
        }
    }

    public DateTime LastModifiedDate
    {
        get
        {
            return _lastModifiedDate;
        }
        set
        {
            LastModifiedDateTextBlock.Text = value.ToString(CultureInfo.InvariantCulture);
            _lastModifiedDate = value;
        }
    }

    public LongListSelectorItemControl()
    {
        InitializeComponent();

        _lastModifiedDate = new DateTime();
    }
}

XAML でユーザー コントロールを次のように使用することを考えました。

<userControls:LongListSelectorItemControl Title="{Binding Subject}" LastModifiedDate="{Binding LastModified}"/>

しかし、何かがうまくいかず、何が原因かわかりません。私のアプリケーションでは、この問題で提示したこの XAML を使用してページが読み込まれ、アプリがクラッシュしないためです。次に、ユーザーは別のページに移動する必要があります。そこでは、いくつかのデータが追加され、ViewModel には表示するデータがいくつかあるため、メイン ページに戻ると、今回は単純にクラッシュします... Application_UnhandledException(App.xaml.csデバッガーを壊します。

追加研究

私は例外を追跡することができましたが、どうやら...

MS.Internal.WrappedException: 'System.Windows.Data.Binding' 型のオブジェクトを 'System.String' 型に変換できません。---> System.ArgumentException: 'System.Windows.Data.Binding' 型のオブジェクトを 'System.String' 型に変換できません

私はまだこれを修正する方法について混乱しています...

何が問題なのかを理解するのに役立つ提案は大歓迎です。ありがとう!

4

1 に答える 1

5

プロパティにバインドできるようにするには、それが依存関係プロパティである必要があります。title プロパティを変更する必要がある方法は次のとおりです。

public partial class LongListSelectorItemControl
{


   public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(LongListSelectorItemControl), new PropertyMetadata(default(string), TitlePropertyChanged));

        private static void TitlePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            LongListSelectorItemControl myControl=d as LongListSelectorItemControl;
            myControl.TitleTextBlock.Text = e.NewValue as string;
        }

        public string Title
        {
            get { return (string) GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }
....
}

LastModifiedDate プロパティでも同じことを行う必要があります。

于 2013-09-28T23:06:25.067 に答える