none
データバインディングの初期値 RRS feed

  • 質問

  • WPFのBindingについて質問です。

    XAMLのある要素のプロパティ値をBindingクラスのPath指定してデータバインディングさせようとしているのですが、

    このPathの参照先がない場合は固定値(関数optional引数でいう既定値的なもの)、ある場合はその参照値を適用させたいです。

    参照先が無い場合の固定値はxaml内で定義したいです。

    例としては下記のような構造です。

    <Grid>

    <Label Content="文字列" Visibility={"Binding Path=Sample}"/>   <!--Sampleを定義しているファイルをプロジェクトに含めない場合がある--><!--Visibilityの既定値的なものをこの周辺で指定?-->

    </Grid>

     このような構造でSampleがない場合、Visibilityを"Visible", ある場合"Hidden"にするという感じです。


    PriorityBindingではプロパティ値の変更方法が見出せませんでした。

    何かしら解決方法を教えて頂けると助かります。よろしくお願いします。


    • 編集済み tenpu 2014年1月31日 2:15
    2014年1月31日 1:27

回答

  • まずPriorityBindingに対する私の認識としては、FallbackValue含め文字列を返すことしかできないと思っています。

    任意のオブジェクトを指定できます。列挙体なら{x:Static Visibility.Hidden}のようにx:Staticマークアップ拡張を使用できます。

    あるいはリソースに定義しておいて{StaticResource ...}を使用することもできます。

    <Binding><Binding.FallbackValue><Visibility>Hidden</Visibility</Binding.FallbackValue>のような指定も可能です。

    まあバインディングターゲットがVisibility型なら、文字列で記述しても暗黙に型変換を試みるので、単にHidden等と書いても列挙体の場合は問題ないですが。

    さて、XAMLの中身は検証していませんが、バインディングをXAMLで表現できているのなら

    <Label Content="文字列">
        <Label.Visibility>
            <PriorityBinding ...>

    でいいんでは。

    PriorityBindingサンプルは <TextBlock.Text>に対して利用しているものしか見つからなかったので、変更方法が見い出せないという表現を致しました。

    何から何に変更するのかが分かりません……。


    • 編集済み Hongliang 2014年1月31日 6:55 文字列だけってのにも回答
    • 回答としてマーク tenpu 2014年2月3日 0:50
    2014年1月31日 6:47

すべての返信

  • ConverterとFallbackValueでどうとでもなりそうですが。

    PriorityBindingではプロパティ値の変更方法が見出せませんでした。

    これは、どういうバインディングを記述してどういう操作をしたときに、どういう動作を期待していたがどういう結果になったのか、全く分かりません。

    2014年1月31日 3:17
  • まずPriorityBindingに対する私の認識としては、FallbackValue含め文字列を返すことしかできないと思っています。

    記述としては

    ---->

    <PriorityBinding FallbackValue="Visible">

    <Binding Path="VisiblityValue" Converter="{StaticResource ValueConverter}" />

    </PriorityBinding>

    <-----

    上記のBindingの結果を

    <Grid>

    <Label Content="文字列" Visibility={・・・}"/>   --- ①

    </Grid>

    ①のVisibility=に設定したいのですが、方法が分かっておりません。(できればxamlのみの記述で)

    動作としてはVisiblityValueがプロジェクト内で見つかれば(定義されていれば)、Visibility="Hidden"に、なければVisibility="Visible"になることを期待しております。

    PriorityBindingサンプルは <TextBlock.Text>に対して利用しているものしか見つからなかったので、変更方法が見い出せないという表現を致しました。


    • 編集済み tenpu 2014年1月31日 5:47
    2014年1月31日 5:47
  • まずPriorityBindingに対する私の認識としては、FallbackValue含め文字列を返すことしかできないと思っています。

    任意のオブジェクトを指定できます。列挙体なら{x:Static Visibility.Hidden}のようにx:Staticマークアップ拡張を使用できます。

    あるいはリソースに定義しておいて{StaticResource ...}を使用することもできます。

    <Binding><Binding.FallbackValue><Visibility>Hidden</Visibility</Binding.FallbackValue>のような指定も可能です。

    まあバインディングターゲットがVisibility型なら、文字列で記述しても暗黙に型変換を試みるので、単にHidden等と書いても列挙体の場合は問題ないですが。

    さて、XAMLの中身は検証していませんが、バインディングをXAMLで表現できているのなら

    <Label Content="文字列">
        <Label.Visibility>
            <PriorityBinding ...>

    でいいんでは。

    PriorityBindingサンプルは <TextBlock.Text>に対して利用しているものしか見つからなかったので、変更方法が見い出せないという表現を致しました。

    何から何に変更するのかが分かりません……。


    • 編集済み Hongliang 2014年1月31日 6:55 文字列だけってのにも回答
    • 回答としてマーク tenpu 2014年2月3日 0:50
    2014年1月31日 6:47
  • Hongliangさん

    ありがとうございます。なにぶんxamlに関する知識が未熟なため、ご教授頂いたような記述法があることを知りませんでした。

    動作として、希望の動作をさせることができました。

    何から何に変更するのかが分かりません……。

     これはVisibilityの値をHidden←→Visibleに変更するという意味でした。

    2014年1月31日 10:22