お世話になっております。
WPFを利用したアプリケーションの開発について勉強しています。
現在、xamlファイル内で元々. 配列[0]の形式でバインドしていた箇所に対して、
添え字の値を列挙型から取得できるような方法を現在模索していますが、少々行き詰っておりまして、
お力添え頂けないでしょうか。
Web等で検索してみると、配列[(int)列挙型.値]のような形式で実装はできないような旨もあり、
そもそも実現が可能なのかという点も踏まえてご相談させて頂ければと思います。
実現したいこと
xamlファイル内で、『{Binding Path=MyArray[(int)EnumType.Normal]}』のような形式で
配列の添え字にアクセスしたいです。
恐らく、配列ではなく、Dictionary型にすることで、Dictionary[(local:定義したEnum) 値]のような形式であれば
列挙型の値を利用してのアクセスも可能だと考えています。
現行が配列[添え字]の形式でバインドされているので、影響範囲を考えるとできる限り修正が少なく
(可能であればConverterをかませる等)で出来たらうれしいです。
前提・試したこと
下記コードにて、xamlファイル内でバインドした結果①~③の通りとなりました。
①配列(添え字)
MyArray[0] → アクセス可能
②配列[(int)列挙型]
MyArray[(int)EnumType.Normal] →アクセス不可(※エラー発生)
③Dictionary型(キー値)
MyTypes[(local:EnumType)Normal] → アクセス可能
【実装時仕様】
※列挙型は本来値が50ほどあるので、各Enumの値それぞれでプロパティを作成するようなやり方は避けたいと考えています。
発生している問題・エラーメッセージ
※②の場合のエラー内容は下記の通りです。
System.Windows.Markup.XamlParseException HResult=0x80131501 Message=''System.Windows.Baml2006.TypeConverterMarkupExtension' の値の指定時に例外がスローされました。' 行番号 '12'、行位置 '20'。 Source=PresentationFramework スタック トレース: 場所 System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri) 場所 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 場所 System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) 場所 System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) 場所 System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 場所 WpfBinding.MainWindow.InitializeComponent() (D:\WpfBinding\WpfBinding\MainWindow.xaml):行 1 この例外は、最初にこの呼び出し履歴 [外部コード] でスローされました 内部例外 1: XamlParseException: 型参照は '{http://schemas.microsoft.com/winfx/2006/xaml/presentation}int' という名前の型を見つけることができません。
該当のソースコード
C#
1//MainViewModel.cs 2using System.Collections.Generic; 3 4namespace WpfBinding 5{ 6 public enum EnumType 7 { 8 Normal, 9 All, 10 None, 11 } 12 public class MainViewModel 13 { 14 public string[] MyArray { get; private set; } 15 16 public Dictionary<EnumType, string> MyTypes { get; private set; } 17 18 19 public MainViewModel() 20 { 21 MyArray = new string[3]; 22 MyArray[(int)EnumType.Normal] = "Normal:配列"; 23 MyArray[(int)EnumType.All] = "All:配列"; 24 MyArray[(int)EnumType.None] = "None:配列"; 25 26 MyTypes = new Dictionary<EnumType, string> 27 { 28 {EnumType.Normal, "Normal:Dicionary"}, 29 {EnumType.All, "All:Dicionary"}, 30 {EnumType.None, "None:Dicionary"}, 31 }; 32 } 33 } 34} 35
xaml
1<!--MainWindow.xaml--> 2<Window x:Class="WpfBinding.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:local="clr-namespace:WpfBinding" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="450" Width="600"> 10 <StackPanel> 11 <TextBlock Text="{Binding Path=MyArray[0]}"/> 12 <!--本来書きたい書き方だとエラーになるのでコメントアウト--> 13 <!--<TextBlock Text="{Binding Path=MyArray[(int)EnumType.Normal]}"/>--> 14 <TextBlock Text="{Binding Path=MyTypes[(local:EnumType)Normal]}"/> 15 16 </StackPanel> 17</Window>
C#
1//MaonWindow.xaml.cs 2namespace WpfBinding 3{ 4 /// <summary> 5 /// Interaction logic for MainWindow.xaml 6 /// </summary> 7 public partial class MainWindow : Window 8 { 9 public MainWindow() 10 { 11 InitializeComponent(); 12 DataContext = new MainViewModel(); 13 } 14 } 15} 16
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Community 2022
.NET 6

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/09/19 23:01
2023/09/19 23:33
2023/09/20 00:12
2023/09/20 09:56