15

XAML には、次の行があります。

<Image x:Name="MainImage" 
       Source="{x:Bind ViewModel.MainPic,Mode=OneWay,TargetNullValue={x:Null}}"
       Stretch="UniformToFill"/>

ViewModel で:

public string MainPic
{
    get
    {
        if (Data == null)
            return default(string);
        else
            return Data.Photos.ElementAtOrDefault(0).url;
    }
}

アプリは正常にコンパイルされますが、実行中に (データが数秒後に入力されるため)、アプリは次の例外でクラッシュします。

System.ArgumentException: パラメータが正しくありません。

デバッガーは次の場所で中断します:

            private void Update_ViewModel_MainPic(global::System.String obj, int phase)
            {
                if((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0)
                {
 /*HERE>>*/          XamlBindingSetters.Set_Windows_UI_Xaml_Controls_Image_Source(this.obj23, (global::Windows.UI.Xaml.Media.ImageSource) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::Windows.UI.Xaml.Media.ImageSource), obj), null);
                }
            }

どうやら、これは MainPic が null を返すために発生します。

現在、このコードは WP8.1 で正常に動作します。コンパイル時エラーが発生する uri を返そうとしました。Win 10 で画像ソースにバインドできるのは文字列のみだと思います (?) データが入力されるまで空白の白い領域が必要なだけなので、ローカルの画像ソースをフォールバックとして提供したくありません。誰かがこれをWin 10に移植するのを手伝ってくれますか?


アップデート:

回答したユーザーのおかげで、次の結論が導き出されました(UWPの場合):

  • 画像ソースを にバインドしている場合、または を空stringにすることはできません。単一の文字またはスペースが機能します。null"""x"" "
  • にバインドするとBitmapImage、戻り値nullが機能します。
  • @Justin-xl で言及されている方法のいずれかを使用できます。私にとって、すべての vm を変更して null を返さないようにするのは困難でした。そのため、単純なコンバーターを xaml に追加することでもうまくいきます。

コンバーターのコードは次のとおりです。

public object Convert(object value, Type targetType, object parameter, string language)
{
    if (string.IsNullOrEmpty(value as string))
    {
        return null;
    }
    else return new BitmapImage(new Uri(value as string, UriKind.Absolute));
}
4

1 に答える 1

15

を使用する場合x:Bind、 のSourceは、 の代わりにImageまったく同じタイプImageSource(例: ) のプロパティにバインドする必要があります。そうしないと、コンパイル時エラーがスローされます。古いバインディングでは文字列を使用できます。これは、リフレクションを使用して実行時に型を解決するためです。BitmapImagestring

私の明示的な型理論が間違っていたことが判明しました (指摘してくれた @igrali に感謝します)。ではない限り、時間Sourceがかかります。したがって、これを修正するには 2 つのオプションがあります。stringnull''

オプション1

uriとして保持しますstringが、 でチェックを行います。またはにvmなったら、ダミーテキストを返します (文字を返すこともできます!)。null''x

オプション 2

を文字列uriからBitmapImageに変更します。次に、 and を使用して null と無効なバインディングを処理できます。TargetNullValueFallbackValue

... FallbackValue='http://Assets/SplashScreen.png' TargetNullValue='http://Assets/SplashScreen.png'}"
于 2015-08-08T23:26:02.873 に答える