StringFormat i MultiBinding z etykietą


40

Chciałbym użyć StringFormat zrobić cos takiego:

<Label x:Name="myLabel"> 
    <Label.Content> 
     <Multibinding StringFormat="{}{0} - {1}"> 
      <Binding Path="Lib1" /> 
      <Binding Path="Lib2" /> 
     </MultiBinding> 
    </Label.Content> 
</Label> 

Jednak to nie działa i mam ten błąd zamiast:

MultiBinding powiodła się, ponieważ nie ma ważnego konwertera. MultiBindingExpression: target element to "Label" (Name = "myLabel"); Właściwością target jest "Content" (type "Object")

Czy jest jakiś sposób, aby ten kod zadziałał?

94

Nie możesz tego powiązać, ponieważ próbujesz powiązać ciąg z obiektem, który nie będzie działał, ponieważ StringFormat wymaga, aby jego cel był typem łańcucha. Można to obejść albo przy użyciu TextBlock zamiast (który ma właściwość Text) albo umieszczenie textblock jako dziecko etykiecie:

<Label x:Name="myLabel"> 
    <Label.Content> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}{0} - {1}"> 
        <Binding Path="Lib1" /> 
        <Binding Path="Lib2" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </Label.Content> 
</Label> 
+1

To jest dokładnie to, co zamierzałem powiedzieć, a ten wpis to potwierdza: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c60b90e6-8426-4c2b-a547-eaa92920862f 09 gru. 102010-12-09 14:30:19

+1

Dziękuję, użyję TextBlock zamiast etykiety. pierwsze rozwiązanie działa również, ale myślę, że drugie jest bardziej eleganckie. 09 gru. 102010-12-09 16:16:42

+4

+1 To drugie rozwiązanie dziedziczy również styl etykiety, co jest niewielką premią, jeśli nie można sobie pozwolić na styl "TextBlock". 22 cze. 122012-06-22 09:57:50


3

Dla tych, zastanawiając się, można również zostawić <Label.Content> tag z odpowiedzią Leom Burke'a . To zapisuje kolejne dwa wiersze kodu.

<Label x:Name="myLabel"> 
    <TextBlock> 
     <TextBlock.Text> 
      <MultiBinding StringFormat="{}{0} - {1}"> 
       <Binding Path="Lib1" /> 
       <Binding Path="Lib2" /> 
      </MultiBinding> 
     </TextBlock.Text> 
    </TextBlock> 
</Label> 

0
<Label> 
    <AccessText> 
     <MultiBinding StringFormat="{x:Static properties:Resources.MyText}"> 
     <Binding Path="MyObj.MyProp" Mode="OneTime"/> 
     </MultiBinding> 
    </AccessText> 
</Label> 

Gdzie Resources.MyText może posiadać coś jak "Fox przeskakuje {0}".