2011-11-23 12 views
6

Nie będę kopiować/wklejać całego pliku XAML. To będzie zbyt długo, aby to wyjaśnić, ale tutaj jest to, co jest ciekawe: Dostałem wiązania „Nazwa” PropertyPowiązanie z drugą właściwością, jeśli pierwsza jest "niezdefiniowana"

<TextBlock Text="{Binding Name}"/> 

Chodzi o to, że czasami, moja pozycja nie posiada właściwość „Nazwa”. To się nie psuje, ale po prostu mam pusty tekst w moim TextBlocku

Co mam zrobić, jeśli Nazwa jest pusta, ma być wiązana do "nic", tylko {Wiążenie}. Spowoduje to wyświetlenie mojej nazwy obiektu i będzie idealna!

Dzięki z góry za wszelką pomoc i przepraszam, jeśli jest to noobie pytanie :(

Odpowiedz

6

Co chcesz o to PriorityBinding.

W szczególności będzie to wyglądać mniej więcej tak (dokładnej składni mogą potrzebować weryfikacji):

  <TextBlock> 
      <TextBlock.Text> 
       <PriorityBinding> 
        <Binding Path="Name"/> 
        <Binding /> 
       </PriorityBinding> 
      </TextBlock.Text> 
     </TextBlock> 

Zauważ, że ten specjalnie spada z powrotem, gdy właściwość Nazwa nie jest dostępny na obiekt jest związany; jeśli właściwość Name ma pustą wartość ciągu, wydaje mi się, że nadal będzie używać tej pustej wartości.

+0

nie jest akceptowany, ale dźwięki rozwiązania wspaniały ! –

+0

Spróbuj:

+1

@Guillaume Dylan edytowany go zobaczyć pełna składnia; Ogólnie, '' jest składnią XAML do ustawiania wartości właściwości o bardziej złożonej konstrukcji, a nie wartości śródliniowej. Rozszerzenie znaczników '{Binding ...}' jest po prostu skrótem do tworzenia instancji klasy 'Binding'. Kompilator XAML wykonuje następnie dodatkową magię specjalnego przypadku, aby uzyskać tekst o nazwie DependencyProperty, dzięki czemu wartość może być ustawiona na wiązanie, które obsługuje, wywołując różne funkcje BindingOperations wymagane do połączenia rzeczy. –

0

Jeśli nie muszą wiązać się z nazwą typu obiektu można wykorzystać TargetNullValue która daje wartość domyślną, jeśli związaną właściwość ma wartość null, tak:

<TextBlock Text="{Binding Name, TargetNullValue=Default}" /> 

Jeśli naprawdę chcesz nazwę typu obiektu Proponuję napisanie konwerter (wdrożenie IValueConverter) Daj mi znać, jeśli chcesz Sample Converter

+0

Po wprowadzeniu kodu nadal mam puste pola TextBlocks, gdy moje obiekty nie mają żadnej właściwości Name. Nie wiem, czy jest to zamierzone, czy nie. O konwerterze, tak naprawdę nie wiem, wydaje mi się to zaskakujące, że nie robimy tego po prostu w pliku xaml! –

+0

Powiązanie właściwości zakończy się niepowodzeniem w tej sytuacji, więc obiekt TargetNullValue nigdy się nie użyje. Nie można uzyskać wartości pustej dla celu, jeśli nie udało się powiązać z celem. –

+0

Niestety, nie zrozumiałem, że brakowało tej nieruchomości, po prostu myślałem, że jest ona zerowa ("jeśli nazwa jest pusta"). Mój błąd. –

0

ten.. jest teoretyczne, ale ..

Chciałbym utworzyć niestandardowy styl i kierować wszystkie bloki tekstowe. W swoim stylu możesz ustawić domyślną wartość tekstową. Jeśli wiązanie nie zastąpi stylu, zostanie użyta wartość domyślna.

Style x:Key="TwitterTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="" /> 
+0

Chcę, aby domyślną wartością była inna wiążąca, a nie statyczna wartość :( –

3

Można zastosować styl z DataTrigger:

<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Text" Value="{Binding Name}"/> 
      <Style.Triggers> 
       <!-- In this binding you could inject a converter which checks for more than null --> 
       <DataTrigger Binding="{Binding Name}" Value="{x:Null}"> 
        <Setter Property="Text" Value="{Binding}"/> 
       </DataTrigger> 
      <Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
+0

Wydaje się działać, ale muszę wiedzieć coś, aby się upewnić, kiedy używam {Binding}. Do jakiej właściwości jest bindowane pole? –

+0

@Guillaume, '{Binding}' oznacza użycie wartości bieżącego DataContext jako wartości do przypisania do właściwości, innymi słowy, pusta ścieżka oznacza po prostu użycie samej instancji obiektu, a nie jednej z jego właściwości. Wiążąca składnia: http://www.nbdtech.com/Free/WpfBinding.pdf –

+1

@GuillaumeCogranne {Binding} spowoduje powiązanie z kontekstem, w którym ustawiony jest bieżący kontekst danych.Dlatego zamiast powiązania z właściwością Name klasy, wiążesz się z klasą zawierającą właściwość Name. –

Powiązane problemy