0

私は奇妙な問題に直面しています。XAML プログラムで ViewModel として使用する 2 つのクラスを作成しました。これら 2 つのクラスは非常に似ていますが、そのうちの 1 つは「プロパティ変更」イベントを UI に渡しません。どちらの場合も binding を使用しますTwoWay。同じUIで1つのクラスを別のクラスに変更しようとしましたMovieGroupが、最終的には機能しませんでしたMovieDataItem(つまり、バインディングのXAML宣言が機能していることが証明されています)

クラスは次のとおりです。

 public class MovieDataItem : DependencyObject
{
    public MovieDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content)
    {
        this.UniqueId = uniqueId;
        this.Title = title;
        this.Subtitle = subtitle;
        this.Description = description;
        this.ImagePath = imagePath;
        this.Content = content;
    }

    public MovieDataItem(MovieDataItem other)
    {
        UniqueId = other.UniqueId;
        Title = other.Title;
        Subtitle = other.Subtitle;
        Description = other.Description;
        ImagePath = other.ImagePath;
        Content = other.Content;
    }

    public string UniqueId { get; set; }

    public String Title
    {
        get { return (String)this.GetValue(TitleProperty); }
        set { this.SetValue(TitleProperty, value); }
    }
    public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(
      "Title", typeof(String), typeof(MovieDataItem), new PropertyMetadata(false));

    public String Subtitle
    {
        get { return (String)this.GetValue(SubtitleProperty); }
        set { this.SetValue(SubtitleProperty, value); }
    }
    public static readonly DependencyProperty SubtitleProperty = DependencyProperty.Register(
      "Subtitle", typeof(String), typeof(MovieDataItem), new PropertyMetadata(false));

    public String Description
    {
        get { return (String)this.GetValue(DescriptionProperty); }
        set { this.SetValue(DescriptionProperty, value); }
    }
    public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register(
      "Description", typeof(String), typeof(MovieDataItem), new PropertyMetadata(false));

    public String Content
    {
        get { return (String)this.GetValue(ContentProperty); }
        set { this.SetValue(ContentProperty, value); }
    }
    public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(
      "Content", typeof(String), typeof(MovieDataItem), new PropertyMetadata(false));

    public String ImagePath
    {
        get { return (String)this.GetValue(ImagePathProperty); }
        set { this.SetValue(ImagePathProperty, value); }
    }
    public static readonly DependencyProperty ImagePathProperty = DependencyProperty.Register(
      "ImagePath", typeof(String), typeof(MovieDataItem), new PropertyMetadata(false));

    public override string ToString()
    {
        return this.Title;
    }

    public void CopyTo(MovieDataItem other)
    {
        other.UniqueId = UniqueId;
        other.Title = Title;
        other.Subtitle = Subtitle;
        other.Description = Description;
        other.ImagePath = ImagePath;
        other.Content = Content;
    }
}

/// <summary>
/// Generic group data model.
/// </summary>
public class MovieGroup : DependencyObject
{
    public MovieGroup(String uniqueId, String title, String subtitle, String imagePath, String description)
    {
        this.UniqueId = uniqueId;
        this.Title = title;
        this.Subtitle = subtitle;
        this.Description = description;
        this.ImagePath = imagePath;
        this.Items = new ObservableCollection<MovieDataItem>();
    }

    public MovieGroup(MovieGroup other)
    {
        UniqueId = other.UniqueId;
        Title = other.Title;
        Subtitle = other.Subtitle;
        Description = other.Description;
        ImagePath = other.ImagePath;
        Items = other.Items;
    }

    public string UniqueId { get; set; }


    public ObservableCollection<MovieDataItem> Items
    {
        get { return (ObservableCollection<MovieDataItem>)this.GetValue(ItemsProperty); }
        set { this.SetValue(ItemsProperty, value); }
    }
    public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
      "Items", typeof(ObservableCollection<MovieDataItem>), typeof(MovieGroup), new PropertyMetadata(false));

    public String Title
    {
        get { return (String)this.GetValue(TitleProperty); }
        set { this.SetValue(TitleProperty, value); }
    }
    public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(
      "Title", typeof(String), typeof(MovieGroup), new PropertyMetadata(false));

    public String Subtitle
    {
        get { return (String)this.GetValue(SubtitleProperty); }
        set { this.SetValue(SubtitleProperty, value); }
    }
    public static readonly DependencyProperty SubtitleProperty = DependencyProperty.Register(
      "Subtitle", typeof(String), typeof(MovieGroup), new PropertyMetadata(false));

    public String Description
    {
        get { return (String)this.GetValue(DescriptionProperty); }
        set { this.SetValue(DescriptionProperty, value); }
    }
    public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register(
      "Description", typeof(String), typeof(MovieGroup), new PropertyMetadata(false));

    public String ImagePath
    {
        get { return (String)this.GetValue(ImagePathProperty); }
        set { this.SetValue(ImagePathProperty, value); }
    }
    public static readonly DependencyProperty ImagePathProperty = DependencyProperty.Register(
      "ImagePath", typeof(String), typeof(MovieGroup), new PropertyMetadata(false));

    public override string ToString()
    {
        return this.Title;
    }

    public void CopyTo(MovieGroup other)
    {
        other.UniqueId = UniqueId;
        other.Title = Title;
        other.Subtitle = Subtitle;
        other.Description = Description;
        other.ImagePath = ImagePath;
        other.Items = Items;
    }
}

追加情報:

は次のDataContextように設定されています。

DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"

オブジェクトは次のとおりです。

ObservableDictionary defaultViewModel = new ObservableDictionary();

次に、映画のグループと項目を辞書に追加します。テスト目的で、xaml フォームを 1 つだけ使用し、2 つのオブジェクトを交互に使用しました (これらには、使用できる共通のプロパティ名があります)。こんなふうになります:

//C#; Adding Group to the dictionary
MovieGroup group = new MovieGroup(Guid.NewGuid().ToString(), "My Category", String.Empty, String.Empty, "Description");

DefaultViewModel.Add("Group", group);

今XAML:

<TextBlock Text="{Binding Group.Title, Mode=TwoWay}" 
           Foreground="{StaticResource ListViewItemOverlayForegroundThemeBrush}"
           Style="{StaticResource BaseTextBlockStyle}" 
           Height="60" 
           Margin="15,0,15,0" 
           FontWeight="SemiBold"/>
<TextBlock Text="{Binding Group.Subtitle}" 
           Foreground="{StaticResource ListViewItemOverlaySecondaryForegroundThemeBrush}" 
           Style="{StaticResource BaseTextBlockStyle}" 
           TextWrapping="NoWrap" 
           Margin="15,0,15,10" 
           FontSize="12"/>

これは機能します。MovieDataItemしかし、他に何も変更せずにデータ ソースを使用するように変更すると、機能しません。

映画のグループを変更します。どちらにも Title プロパティと Subtitle プロパティがあるため、何も変更する必要はありません。

MovieDataItem movie = new MovieDataItem(Guid.NewGuid().ToString(), "My Movie", "Subtitle", String.Empty, "Description", String.Empty);

DefaultViewModel.Add("Group", movie);
4

0 に答える 0