ItemControl配置時のXAMLエラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kakashi

ItemControl配置時のXAMLエラーについて

#1

投稿記事 by kakashi » 5年前

[1] 質問文
 [1.1] 自分が今行いたい事は何か
・MainWindowからChartWindowを呼び出す。
・ChartWindowにはItemControl(ユーザーコントロール ChartControl)が配置され、
 ChartWindow呼び出し時、動的にユーザーコントロールが追加される
・ChartControlはTextBlockとImageコントロールを持っている

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
ChartWindow.xaml

コード:

<Window
	・
	・
	・
    <!--コンテキスト-->
    <Window.DataContext>
        <localVM:ChartViewModel />
    </Window.DataContext>
	・
	・
	・
        <ItemsControl Grid.Column="0" ItemsSource="{Binding Path=DataList}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <UserControl:ChartControl Number="{Binding Number}" CImage="{Binding CImage}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
	・
	・
	・
</Window>
ChartWindow.xaml.cs

コード:

    public partial class ChartWindow : Window {
        public TimeChartWindow(List<ChartDataInfo> chartDataInfos) {
            InitializeComponent();
            var vm = new ChartViewModel();
            foreach(var c in chartDataInfos) {
                vm.DataList.Add(c);
            }
            this.DataContext = vm;
        }
    }
ChartViewModel.cs

コード:

    public class ChartViewModel {
        public ObservableCollection<ChartDataInfo> DataList { get; set; } = new ObservableCollection<ChartDataInfo>();

        public TimeChartViewModel() {}
    }
ChartControl.xaml

コード:

<UserControl
	・
	・
	・
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Margin="5" FontSize="36" VerticalAlignment="Center" TextAlignment="Center" Text="{Binding Number}"/>
        <Image Grid.Column="1" Margin="5" Source="{Binding CImage}"/>
    </Grid>
</UserControl>
ChartControl.xaml.cs

コード:

    public partial class ChartControl : System.Windows.Controls.UserControl {
        public static readonly DependencyProperty TextProperty = 
            DependencyProperty.Register("Number", typeof(string), typeof(ChartControl));
        public static readonly DependencyProperty ChartImageProperty =
            DependencyProperty.Register("CImage", typeof(string), typeof(ChartControl));


        public ChartControl() {
            InitializeComponent();
        }

        public string Number {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public ImageSource CImage {
            get { return (ImageSource)GetValue(ChartImageProperty); }
            set { SetValue(ChartImageProperty, value); }
        }
    }
ChartDataInfo.cs

コード:

    public class ChartDataInfo {
        public string Number { get; set; }
        public ImageSource CImage { get; set; }
    }
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
実行は自分の望む動作となっているが、ChartWIndows.xamlにてエラーが表示される

コード:

XamlParseException: 型 'xxxxxxxxxxxxxxx_UserControl_ChartControl_8_389775820' の 'Number' プロパティで 'Binding' を設定することはできません。'Binding' は、DependencyObject の DependencyProperty でのみ設定できます。

場所 System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
   場所 System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
   場所 System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
   場所 System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
   場所 System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
   場所 System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
   場所 System.Windows.FrameworkElement.ApplyTemplate()
   場所 System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   場所 System.Windows.UIElement.Measure(Size availableSize)
   場所 System.Windows.Controls.StackPanel.StackMeasureHelper(IStackMeasure measureElement, IStackMeasureScrollData scrollData, Size constraint)
   場所 System.Windows.Controls.StackPanel.MeasureOverride(Size constraint)
   場所 System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   場所 System.Windows.UIElement.Measure(Size availableSize)
   場所 System.Windows.ContextLayoutManager.UpdateLayout()
   場所 System.Windows.UIElement.UpdateLayout()

InnerException: なし

 [1.4] 今何がわからないのか、知りたいのか
XAMLでエラーが出ないようにする

[2] 環境  
 [2.1] Windows 10 pro 64bit
 [2.2] Visual Studio 2019

以上になります。
お手数をおかけしますが、ご回答のほど、よろしくお願いいたします。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: ItemControl配置時のXAMLエラーについて

#2

投稿記事 by YuO » 5年前

依存関係プロパティ関連の名前を正しくすれば解決するかと思います。


Xamlで利用する依存関係プロパティは、名前付け規約に従う必要があります。
  • プロパティの名前と、DependencyProperty.Registerの第1引数は一致させる
  • 識別子フィールドの名前は、プロパティの名前にサフィックスPropertyを付けた物とする
今回の場合、
  • Numberに対応する識別子フィールドNumberPoprertyが存在せず、TextPropertyが使われている
  • CImageに対応する識別子フィールドCImagePropertyが存在せず、ChartImagePropertyが使われている
の2点が問題になります。
この2点について、識別子フィールドの名前をプロパティ名にあった物に変えてみてはどうでしょうか。

ref) 依存関係プロパティの命名規則 - 依存関係プロパティを定義するためのチェックリスト - カスタム依存関係プロパティ | Microsoft Docx

kakashi

Re: ItemControl配置時のXAMLエラーについて

#3

投稿記事 by kakashi » 5年前

Yuo様

前回もお世話になり、今回もご回答ありがとうございます。
今回もご指摘通り、無事解決致しました。

誠にありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る