一連のコードに関連する問題がありますが、それを切り分けました。TL;DR; が必要な場合。さらに下にジャンプします。少しコンテキストが必要な場合は、これが私の状況です。
バインディング用に 3 つのデータ コンバーターを作成しました。それらの 1 つは「文字列プレフィックス」です。これは、入力したものに固定文字列をプレフィックスとして付けます。現在の例では、その固定文字列は"ms-appx:///cache/"
. 2 つ目はstring
型を にImageSource
変換し、3 つ目は複数のコンバーターをチェーンします。
次に、という名前の Xaml リソースを作成しましたLocalCacheFile
。あなたが思うようにすべてが機能します。このための Xaml コードは次のようになります。
<Image Source="{x:Bind imageSource,Converter={StaticResource LocalCacheFile}}" />
ただし、次の問題があります。FallbackValue を使用してimageSource
が空の場合のプレースホルダー イメージを配置しようとすると、奇妙な動作が発生しx:Bind
ます。
次のコードは、期待どおりに機能します。
<Image Source="{Binding imageSource,FallbackValue='ms-appx:///Assets/default.png',Converter={StaticResource LocalCacheFile}}" />
しかし
<Image Source="{x:Bind imageSource,FallbackValue='ms-appx:///Assets/default.png',Converter={StaticResource LocalCacheFile}}" />
ではない!
私はそれを 1 つのコンバーターに分離しましたがDependencyProperty.UnsetValue
、x:Bind が処理されていないようです。
TL;DR; これは、テストとして単独で使用すると、同じ誤った動作をトリガーする、私の文字列プレフィックスのコードです。
public class StringPrefix : IValueConverter
{
public string prefix { get; set; }
public object Convert(object value, Type typeName, object parameter, string language)
{
if (value == DependencyProperty.UnsetValue || value == null || (string)value == "")
return DependencyProperty.UnsetValue ;
return (prefix + value.ToString());
}
public object ConvertBack(object value, Type typeName, object parameter, string language)
{
throw new NotImplementedException();
}
}
上記のコンバーターは、Binding
. とともに使用すると、型例外が発生しx:Bind
ます。
これどうしたの?
編集:例外に関する詳細。
生成されたコードは次のとおりです。
private void Update_project_imageSource(global::System.String obj, int phase)
{
if((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0)
{
XamlBindingSetters.Set_Windows_UI_Xaml_Controls_Image_Source(this.obj16, (global::Windows.UI.Xaml.Media.ImageSource)this.LookupConverter("LocalCacheFile").Convert(obj, typeof(global::Windows.UI.Xaml.Media.ImageSource), null, null), null);
}
}
例外の詳細:
System.InvalidCastException was unhandled by user code
HResult=-2147467262
Message=Unable to cast object of type 'System.__ComObject' to type 'Windows.UI.Xaml.Media.ImageSource'.
Source=Test
StackTrace:
at Test.Pages.ProjectView.ProjectView_obj1_Bindings.Update_project_imageSource(String obj, Int32 phase)
at Test.Pages.ProjectView.ProjectView_obj1_Bindings.Update_project(Project obj, Int32 phase)
at Test.Pages.ProjectView.ProjectView_obj1_Bindings.Update_(ProjectView obj, Int32 phase)
at Test.Pages.ProjectView.ProjectView_obj1_Bindings.Update()
at Test.Pages.ProjectView.<.ctor>b__6_0(FrameworkElement s, DataContextChangedEventArgs e)
InnerException:
(私には、生成されたコードがデフォルト値の可能性を扱っていないように見えます。ところで、それ__ComObject
はDependencyProperty.UnsetValue
.
編集 2 : Convert 関数を DependencyProperty.UnsetValue 関数の代わりに null を返すように変更した場合、それを追加する必要がありますx:Bind
が、その後、関数を使用するという期待される仕事x:Bind
も実行しませんBinding
FallbackValue