Jak mogę przekazać stałą wartość dla 1 powiązania w powiązaniu wielokrotnym?

98

Mam polubienie multi-bindowania

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

Chcę przekazać stałą wartość, np. „123”, do jednego z dwóch powyższych powiązań. Jak mogę to zrobić za pomocą XAML?

Nam G VU
źródło
1
jakieś fragmenty kodu / przykłady?
Torsten,
Myślę, że brakuje jakiejś części pytania, odnosisz się do powiązania powyżej, ale nie widzę w pytaniu żadnego kodu wiążącego.
akjoshi
1
Jakoś za każdym razem, gdy mam pytanie, ktoś miał dokładnie to samo pytanie wcześniej :) Świetnie!
Ignacio Soler Garcia
1
Czwartym sposobem, aby to zrobić, byłoby użycie tej odpowiedzi: stackoverflow.com/a/2552911/222134
Johny Skovdal

Odpowiedzi:

148

Jeśli twoją wartością jest po prostu a string, możesz określić ją jako stałą we Sourcewłaściwości wiązania. Jeśli jest to inny prymitywny typ danych, należy zdefiniować zasób statyczny i odwołać się do niego.

Zdefiniuj sysprzestrzeń nazw w katalogu głównym XAML do wskazywania Systemw mscorlib, a następujące elementy powinny działać:

<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
źródło
1
@tofutim Dzieje się tak, ponieważ wydaje się, że MultiBinding nie ma zasobów. Zamiast tego użyj TextBlock.Resources ...
Martin Hennings
6
Może powinieneś dodać xmlns: sys = "clr-namespace: System; assembly = mscorlib" do swojego rozwiązania ;-)
c0d3b34n
104

Lub łącząc dwie powyższe odpowiedzi:

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

Który zapewnia właściwy typ bez kludge zasobów.

Anders Kaplan
źródło
2
Konieczne jest zdefiniowanie przestrzeni nazw sysw nagłówku dokumentu:xmlns:sys="clr-namespace:System;assembly=mscorlib"
Piękno
26

Nie do końca rozumiem pytanie, ale są dwie opcje:

Umieść linię <Binding Source="123" />w swoim multibindingu, aby przekazać 123 jako wartość związaną do twojego konwertera.

Umieść ConverterParameter="123"swój MultiBinding:

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

benPearce
źródło
<Binding Source = "123" /> zdaje się przekraczać DependencyProperty.UnsetValue
Josh Stribling,
<Binding Source = "123" /> przekazuje ciąg "123" zamiast liczby całkowitej lub podwójnej, którą zamierzałem w moim przypadku.
Marcel Gosselin
W IValueConverterprogramie parametry są przekazywane jako object, co oznacza, że ​​należy w bezpieczny sposób rzutować wartość na właściwy typ. IValueConverter.Convert
benPearce
6

Nie mówię, że jest to szczególnie dobra odpowiedź, ale oto inne podejście:

<Binding Path="DoesNotExist" FallbackValue="123" />
David Hollinshead
źródło