私のViewmodelには、LoggedInAs
stringEditMode
型とbool型のプロパティがあります。ReaderList
次のような表示目的でItemsControlにバインドするListプロパティもあります。
<ItemsControl Name="ReaderList" ItemTemplateSelector="{StaticResource drts}"/>
Caliburn.Microを使用しているので、名前付けによってバインドが自動的に行われます。アプリケーションがEditModeであり、Personがログインしている場合は、根本的に異なる表示が必要なため、DataTemplateSelectorを使用したいと思います。これが私のリソースの宣言です、
<UserControl.Resources>
<DataTemplate x:Key="OtherPersonTemplate"> ... </DataTemplate>
<DataTemplate x:Key="CurrentUserIsPersonTemplate"> ... </DataTemplate>
<local:DisplayReaderTemplateSelector x:Key="drts"
IsLoggedInAs="{Binding LoggedInAs}"
IsEditMode="{Binding EditMode}"
CurrentUserTemplate="{StaticResource CurrentUserIsPersonTemplate}"
OtherUserTemplate="{StaticResource OtherPersonTemplate}"/>
</UserControl.Resources>
そしてここにクラスのコードがあります:
public class DisplayReaderTemplateSelector: DataTemplateSelector {
public DataTemplate CurrentUserTemplate { get; set; }
public DataTemplate OtherUserTemplate { get; set; }
public string IsLoggedInAs {get; set;}
public bool IsEditMode { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container){
var _r = item as Person;
if (IsEditMode && _r.Name == IsLoggedInAs) return CurrentUserTemplate;
else return OtherUserTemplate;
}
}
何らかの理由で、Viewmodel(またはView)のインスタンス化中にアプリケーションがクラッシュします。エラーはどこにありますか、および/またはこの問題を代わりに解決するにはどうすればよいですか?
編集:クラッシュは、DisplayReaderTemplateSelectorの構築におけるバインディング式が原因でした-IsLoggedIn
とEditMode
はDependencyPropertiesではないためです。
したがって、ここでの問題は、値にバインドできない場合に、ViewModelのステータスに依存するDataTemplateSelectorをどのように作成できるかということです。