2009-07-29 6 views
2

J'ai écrit un UserControl dont DataContext contient une collection et une propriété booléenne. La collection est affichée (et éditée) dans une grille de données, qui a des modèles de colonnes custrom. Le DataContext d'un contrôle dans une colonne est bien sûr un élément de la collection de DataContext UserControl. Cependant, j'ai besoin de lier une propriété du contrôle dans une colonne à la propriété bool de DataContext UserControl et non à l'élément de collection.Est-il possible de lier un contrôle WPF à plusieurs contextes de données?

Avez-vous des idées pour résoudre ce problème?

Cordialement, Oliver

Répondre

4

Je tire ce droit de ma réponse sur un autre poste

Getting at the "parent" of a databound object?

Voici le code du poste que je pense pourrait se rapporter à ce que vous essayez de faire :

<ListBox Name="list" ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding}"/> 
       <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.Values}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Fondamentalement, le DataContext de la zone de liste dans ce cas, contient quelques listes et un combobox dans le DataTemplate de ItemTemplate est lié à un membre différent du DataContext de ListBox tandis que ItemsSource est lié au membre Items de DataContext. Je pense que cela pourrait s'appliquer à vos modèles DataGrid et colonnes.

0

Solution 1. Créez une classe personnalisée qui contient la collection et une propriété booléen et définissez le DataContext sur une instance de cette classe.

Solution 2. Définissez le DataContext du contrôle utilisateur à la collection et ajoutez une propriété bool à votre contrôle utilisateur.

XAML:

<UserControl x:Class="DataContextDemo.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Name="self"> 
    <StackPanel> 
     <ListBox ItemsSource="{Binding}" /> 
     <CheckBox IsChecked="{Binding Path=MyBoolProp, ElementName=self}" /> 
    </StackPanel> 
</UserControl> 
code

derrière:

using System.Windows; 
using System.Windows.Controls; 

namespace DataContextDemo 
{ 
    public partial class UserControl1 : UserControl 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 

     public bool MyBoolProp 
     { 
      get { return (bool)GetValue(MyBoolPropProperty); } 
      set { SetValue(MyBoolPropProperty, value); } 
     } 

     public static readonly DependencyProperty MyBoolPropProperty = 
      DependencyProperty.Register("MyBoolProp", 
             typeof(bool), 
             typeof(UserControl1), 
             new UIPropertyMetadata(true)); 
    } 
} 
Questions connexes