Bagaimana saya bisa melewatkan nilai konstan untuk 1 binding in multi-binding?

97

Saya memiliki multi-binding like

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource myConverter}">
            <Binding Path="myFirst.Value" />
            <Binding Path="mySecond.Value" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Dan saya ingin meneruskan nilai tetap misalnya "123" ke salah satu dari dua binding di atas. Bagaimana saya bisa melakukannya dengan XAML?

Nam G VU
sumber
1
ada potongan kode / contoh?
Torsten
Saya pikir beberapa bagian dari pertanyaan hilang, Anda mengacu pada mengikat di atas tetapi saya tidak melihat kode yang mengikat dalam pertanyaan.
akjoshi
1
Entah bagaimana, setiap kali saya memiliki pertanyaan, seseorang memiliki pertanyaan yang persis sama sebelumnya :) Bagus!
Ignacio Soler Garcia
1
Cara keempat untuk melakukannya adalah dengan menggunakan jawaban ini: stackoverflow.com/a/2552911/222134
Johny Skovdal

Jawaban:

146

Jika nilai Anda hanyalah a string, Anda dapat menetapkannya sebagai konstanta dalam Sourceproperti binding. Jika ini adalah tipe data primitif lainnya, Anda perlu mendefinisikan sumber daya statis dan mereferensikannya.

Tentukan sysnamespace di root XAML yang akan diarahkan ke Systemmscorlib, dan berikut ini seharusnya berfungsi:

<TextBlock>
  <TextBlock.Resources>
    <sys:Int32 x:Key="fixedValue">123</sys:Int32>
  </TextBlock.Resources>
  <TextBlock.Text>
    <MultiBinding Converter="{StaticResource myConverter}">
      <Binding Path="myFirst.Value" />
      <Binding Source="{StaticResource fixedValue}" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
Noldorin
sumber
1
@tofutim Itu karena MultiBinding tampaknya tidak memiliki Sumber Daya. Gunakan TextBlock.Resources sebagai gantinya ...
Martin Hennings
6
Mungkin Anda harus menambahkan xmlns: sys = "clr-namespace: System; assembly = mscorlib" ke solusi Anda ;-)
c0d3b34n
103

Atau, gabungkan dua jawaban di atas:

<MultiBinding Converter="{StaticResource ScalingConverter}">
    <Binding>
        <Binding.Source>
            <sys:Double>0.5</sys:Double>
        </Binding.Source>
    </Binding>
    <Binding ElementName="TC" Path="ActualWidth" />
</MultiBinding>

Yang menyediakan tipe yang tepat tanpa kludge Resources.

Anders Kaplan
sumber
1
Ini diperlukan untuk menentukan namespace sysdi kepala dokumen:xmlns:sys="clr-namespace:System;assembly=mscorlib"
Kecantikan
25

Saya tidak terlalu mengikuti pertanyaannya tetapi ada dua opsi:

Letakkan garis <Binding Source="123" /> di multibinding Anda akan melewati 123 sebagai nilai terikat ke konverter Anda.

Masukkan ConverterParameter="123"MultiBinding Anda:

<MultiBinding Converter="{StaticResource conv}" ConverterParameter="123">

benPearce
sumber
<Binding Source = "123" /> tampaknya melewati DependencyProperty.UnsetValue
Josh Stribling
<Binding Source = "123" /> meneruskan string "123" alih-alih integer atau double yang saya maksudkan dalam kasus saya.
Marcel Gosselin
Di IValueConverter, parameter diteruskan sebagai object, yang berarti Anda perlu memasukkan nilai ke jenis yang benar, dengan cara yang aman. IValueConverter.Convert
benPearce
4

Saya tidak mengatakan ini jawaban yang sangat bagus tetapi ini adalah pendekatan lain:

<Binding Path="DoesNotExist" FallbackValue="123" />
David Hollinshead
sumber