私は奇妙な問題に直面しています。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);