しかし、私は{ "エラーHRESULT E_FAILがCOMコンポーネントへの呼び出しから返されました。"}ばかりの私値変換してください。
このエラーは、通常、存在しないか、XAMLのコンテキスト内にないスタイルまたはイベントハンドラへの参照が発生した場合に発生します。
あなたのコンバーターのコードとxamlコードの一部だけを投稿しましたが、データモデルとxamlを100%再生できませんが、コードからはコンバーターで具体的にはDataTemplate
ですが、実際にはKeyValuePair<object, object>
が返され、リソースはResourceDictionaryに定義されています。詳しくは、ResourceDictionary and XAML resource referencesを参照してください。
ここで私は、私は100%があなたのXAMLとデータモデルを再現しませんでしたもう一度、サンプルを書いた:
MainPage.xamlを:背後
<Page.Resources>
<local:EquipmentTemplateConverter x:Key="EquipmentTemplateConverter" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView ItemsSource="{x:Bind list}">
<ListView.ItemTemplate>
<DataTemplate>
<ContentControl DataContext="{Binding}" Content="{Binding}" ContentTemplate="{Binding Count, Converter={StaticResource EquipmentTemplateConverter}}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
コード:
private ObservableCollection<EquipmentType> list = new ObservableCollection<EquipmentType>();
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
list.Add(new EquipmentType { Count = 0 });
list.Add(new EquipmentType { Count = 1 });
list.Add(new EquipmentType { Count = 0 });
list.Add(new EquipmentType { Count = 0 });
list.Add(new EquipmentType { Count = 1 });
list.Add(new EquipmentType { Count = 1 });
}
マイEquipmentType
クラスはかなり単純です:
public class EquipmentType
{
public int Count { get; set; }
}
とEquipmentTemplateConverter
このようなものです:
public class EquipmentTemplateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
switch ((int)value)
{
case 0:
var a = Application.Current.Resources.FirstOrDefault(r => r.Key.ToString() == "EquipmentNormalTemplate");
return a.Value;
case 1:
var b = Application.Current.Resources.FirstOrDefault(r => r.Key.ToString() == "EquipmentUpgradeTemplate");
return b.Value;
default:
throw new ArgumentOutOfRangeException(nameof(value), value, null);
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
あなたのコンバータでApplication.Resources propertyを使用しているので、私はテストのためにApp.xamlでDataTemplate
を置く:
<Application.Resources>
<DataTemplate x:Key="EquipmentNormalTemplate">
<Grid>
<TextBlock Text="This is EquipmentNormalTemplate." />
</Grid>
</DataTemplate>
<DataTemplate x:Key="EquipmentUpgradeTemplate">
<Grid>
<TextBlock Text="This is EquipmentUpgradeTemplate." />
</Grid>
</DataTemplate>
</Application.Resources>
しかし、私は@Edに同意しますPlunkettは、DataTemplateSelector
を使用してこの作業を行う一般的な方法です。
私はWindowsアプリケーションを作成しているので、私はApplication.CurrentにMainWindowプロパティを持っていません。 – shady
@shady更新しました。 –