2010-11-10 12 views
1

Je voudrais lier les données de ma listbox. Imaginez que j'ai quelque chose comme:Xaml Liaison hors modèle

<ListBox ItemsSource="{Binding MyList}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text={Binding Value} /> 
     <TextBlock Text={Binding AbsoluteValue} /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

MyList contient une collection observable d'un objet qui a une propriété nommée « Value » AbsoluteValue est une propriété du modèle de vue, comme la propriété MyList.

Bien sûr, la zone de texte faudra toujours seconde la même valeur, mais il est ce que je veux :)

Comment puis-je dire à la liaison que le DataContext n'est pas la même chose pour la deuxième zone de texte?

Merci à l'avance pour toute aide

EDIT: mon vrai échantillon est un StackPanel. J'ai tryed

private void StackPanel_Loaded(object sender, RoutedEventArgs e) 
{ 
    StackPanel stackPanel = sender as StackPanel; 
    stackPanel.SetBinding(StackPanel.VisibilityProperty, new Binding("Loaded") { Source = DataContext, Mode = BindingMode.TwoWay }); 
} 

mais il ne fonctionne pas

Répondre

0

XAML:

<TextBlock x:Name="tbAbsoluteValue" Loaded="AbsoluteValue_Loaded" /> 

Codebehind:

void AbsoluteValue_Loaded(object sender, RoutedEventArgs e) 
{ 
    TextBlock absoluteValue = sender as TextBlock; 

    absoluteValue.SetBinding(TextBlock.TextProperty, new Binding("AbsoluteValue") { Source = VIEW_MODEL_OBJECT, Mode = BindingMode.TwoWay }); 
} 

C'est une façon d'obtenir ce que vous voulez, vous pouvez aussi utiliser un convertisseur aussi, ou créer un StaticResource dans votre Resources pour la machine virtuelle et se lier à celle-ci en tant que source.

+0

En fait, ce n'est pas une zone de texte, mais un StackPanel avec VisibilityProperty. J'ai essayé: private void StackPanel_Loaded (expéditeur d'objet, RoutedEventArgs e) { StackPanel stackPanel = expéditeur comme StackPanel; stackPanel.SetBinding (StackPanel.VisibilityProperty, nouvelle liaison ("Loaded") {Source = DataContext, Mode = BindingMode.TwoWay}); } mais cela ne fonctionne pas – Tim

+0

Je suppose que votre propriété Loaded sur votre machine virtuelle est un booléen? VisibilityProperty est du type Visibility. Vous avez besoin d'un convertisseur. (Bool to Visibility) –

+0

oh oui, oubliez de l'utiliser :( stackPanel.SetBinding (StackPanel.VisibilityProperty, nouvelle liaison ("Loaded") {Source = DataContext, Mode = BindingMode.TwoWay, Convertisseur = nouvelle VisibilityConverter()}) ; c'est ok avec ça :) merci – Tim