2010-07-08 4 views
1

J'essaie d'utiliser WPF MultiBinding pour cibler une propriété personnalisée que j'ai définie sur mon UserControl. Je n'ai pas de chance. Tous les exemples que j'ai vus ciblent les propriétés .Net intégrées (Text, ItemSource, IsEnabled). Je me demande si vous pouvez cibler une propriété personnalisée. S'il vous plaît aider.Ciblage d'une propriété personnalisée avec des liaisons multiples dans Silverlight

/// 
public partial class ActivityStatusDisplay : UserControl 
{ 


    public ActivityStatusDisplay() 
    { 
     InitializeComponent(); 
    } 

    /// <summary> 
    /// Gets or sets the value for the read/write property named 
    /// Status. 
    /// 
    /// </summary> 
    public TaskStatuses Status 
    { 
     get 
     { 
      return (TaskStatuses)GetValue(StatusProperty); 
     } 
     set 
     { 
      SetValue(StatusProperty, value); 

      UpdateForStatus(value); 
     } 
    } 


    public static readonly DependencyProperty StatusProperty = DependencyProperty. 
     Register("Status", typeof(TaskStatuses), typeof(ActivityStatusDisplay), null); 

avec le XAML pour la liaison à la recherche comme un de ces:

<my:DataGrid ItemsSource="{Binding PatientTaskCollection}"> 
        <my:DataGrid.Columns> 
         <my:DataGridTemplateColumn Header="Status" Width="Auto"> 
          <my:DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <my1:ActivityStatusDisplay Margin="3"> 
             <mb:BindingUtil.MultiBindings> 
              <mb:MultiBindings> 
               <mb:MultiBinding TargetProperty="Status" Converter="{StaticResource StatusConverter}"> 
                <mb:MultiBinding.Bindings> 
                 <mb:BindingCollection> 
                  <Binding Path="RecoveryTaskStatusID"/> 
                  <Binding Path="Due"/> 
                 </mb:BindingCollection> 
                </mb:MultiBinding.Bindings> 
               </mb:MultiBinding> 
              </mb:MultiBindings> 
             </mb:BindingUtil.MultiBindings> 
            </my1:ActivityStatusDisplay> 

ou quelque chose comme:

<my:DataGrid ItemsSource="{Binding PatientTaskCollection}"> 
         <my:DataGrid.Columns> 
          <my:DataGridTemplateColumn Header="Status" Width="Auto"> 
           <my:DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <my1:ActivityStatusDisplay Margin="3"> 
              <my1:ActivityStatusDisplay.Status> 
              <mb:MultiBinding Converter="{StaticResource StatusConverter}"> 
                   <Binding Path="RecoveryTaskStatusID"/> 
                   <Binding Path="Due"/> 

                </mb:MultiBinding> 
              </my1:ActivityStatusDisplay.Status> 

Répondre

2

problème vous est que vous assumez la méthode "setter" pour la La propriété Status est appelée lorsque la liaison modifie sa valeur. Cela n'arrive pas. La liaison appelle directement la méthode SetValue. Par conséquent, votre appel à UpdateForStatus ne se produit pas lorsque la valeur est modifiée à la suite d'une liaison.

Voici comment votre propriété de dépendance devrait ressembler, (je suppose TaskStatuses est un type ENUM)

public TaskStatuses Status 
{ 
    get { return (TaskStatuses)GetValue(StatusProperty); } 
    set { SetValue(StatusProperty, value); } 
} 


public static readonly DependencyProperty StatusProperty = 
    DependencyProperty.Register(
    "Status", 
    typeof(TaskStatuses), 
    typeof(ActivityStatusDisplay), 
    new PropertyMetaData(TaskStatuses.Default, OnStatusPropertyChanged)); 

private static void OnStatusPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    ActivityStatusDisplay source = (ActivityStatusDisplay)d; 
    TaskStatuses value = (TaskStatuses)e.NewValue; 
    source.UpdateForStatus(value); 
} 

Utilisation du paramètre PropertyMetaData de la méthode Register nous pouvons spécifier la valeur par défaut cette propriété doit avoir et une méthode de rappel statique à appeler chaque fois que la valeur de la propriété de dépendance est modifiée. C'est à partir de cette méthode de rappel que vous souhaitez appeler votre méthode UpdateForStatus.

+0

Si vertigineux en ce moment ... qui a fonctionné. Je vais être sûr de vous envoyer des redevances pour tout l'argent que nous faisons de cette chose. Merci beaucoup. –

+0

J'ai essayé de "voter" votre réponse, mais je suis trop noob pour le faire. –

+0

@Mark: Heureux que cela a aidé, l'argent n'est pas nécessaire. En cliquant sur la grande grosse coche à côté de cette réponse suffirait. – AnthonyWJones

Questions connexes