2010-07-08 51 views
1

我想要使用WPF MultiBinding來定位我的UserControl上定義的自定義屬性。我沒有任何運氣。我見過的所有例子都內置了.Net屬性(Text,ItemSource,IsEnabled)。我想知道您是否可以定位自定義屬性。請幫忙。針對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); 

與XAML結合看起來像這些之一:

<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> 

或類似的東西:

<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> 

回答

2

您的問題是,我們假定你是對的「二傳手」的方法Status屬性在綁定更改其值時被調用。這不會發生。綁定直接調用SetValue方法。因此,當由於綁定而修改值時,不會發生對UpdateForStatus的調用。

這是你的依賴屬性應該是什麼樣子,(我假設TaskStatuses是一個枚舉型)

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); 
} 

使用Register方法的PropertyMetaData參數,我們可以指定默認值,此屬性應該有和每當更改依賴項屬性的值時調用一個靜態回調方法。它從這個回調方法,你想打電話給你的UpdateForStatus方法。

+0

現在這麼令人頭暈目眩......工作。我一定會向你支付我們爲此賺取的任何款項的版稅。非常感謝,非常感謝。 – 2010-07-08 16:56:27

+0

我試圖「回答」你的答案,但我太過於做這個事情了。 – 2010-07-08 16:57:09

+0

@Mark:很高興幫助,沒有必要的錢。點擊此答案旁邊的巨大勾號就足夠了。 – AnthonyWJones 2010-07-08 17:01:12