2008-11-04 83 views
3

我覺得我錯過了一個相當基本的概念WPF涉及到數據綁定,但我似乎無法找到正確的谷歌關鍵字組合來找到我後,所以也許SO社區可以提供幫助。 :)暴露多個數據綁定源

我有一個WPF用戶控件,需要將數據綁定到兩個單獨的對象才能正確顯示。兩個對象都必須從外部來源動態設置。到目前爲止,我只是將表單的DataContext屬性用於動態對象綁定,但只允許引用一個對象。我覺得這是一個簡單的問題,我必須錯過一些明顯的東西。

我以前的嘗試看起來是這樣的:

<UserControl.Resources> 
    <src:Person x:Key="personSource" /> 
    <src:Job x:Key="jobSource" /> 
</UserControl.Resources> 
<TextBox Text="{Binding Source={StaticResource personSource}, Path=Name" /> 
<TextBox Text="{Binding Source={StaticResource jobSource}, Path=Address" /> 

這將綁定到任何默認我給班就好了,但如果我嘗試動態地設置在代碼中的對象(如我在下面)我沒有看到任何改變。

Person personSource = FindResource("personSource") as Person; 
personSource = externalPerson; 
Job jobSource= FindResource("jobSource") as Job; 
jobSource = externalJob; 

我錯過了什麼?

回答

4

我可能會使用具有兩個DependencyProperties的CustomControl。然後,使用您的自定義控件的外部網站可以將他們想要的數據綁定到該控件,也可以使用自定義控件來控制控件在不同情況下的外觀。

自定義控制代碼看起來是這樣的:

public class CustomControl : Control 
{ 
    public static readonly DependencyProperty PersonProperty = 
     DependencyProperty.Register("Person", typeof(Person), typeof(CustomControl), new UIPropertyMetadata(null)); 
    public Person Person 
    { 
     get { return (Person) GetValue(PersonProperty); } 
     set { SetValue(PersonProperty, value); } 
    } 


    public static readonly DependencyProperty JobProperty = 
     DependencyProperty.Register("Job", typeof(Job), typeof(CustomControl), new UIPropertyMetadata(null)); 
    public Job Job 
    { 
     get { return (Job) GetValue(JobProperty); } 
     set { SetValue(JobProperty, value); } 
    } 

    static CustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl))); 
    } 
} 

Generic.xaml是應爲你創建,並可能有一種風格,看起來是這樣的文件:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication3"> 


    <Style TargetType="{x:Type local:CustomControl}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:CustomControl}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <StackPanel> 
          <TextBox Text="{TemplateBinding Person.Name}" /> 
          <TextBox Text="{TemplateBinding Job.Address}" /> 
         </StackPanel> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

最後,當你去使用你的控制,你會做這樣的事情。

<src:CustomControl Person="{Binding Person}" Job="{Binding Job}" /> 
+0

這似乎是它的工作,但現在我有一個不同的問題。我真的不想使用樣式來綁定這些元素,但每當我嘗試引用新的依賴項屬性時,它都會嘗試在datacontext中找到它,而不是我的本地對象。我如何顯式引用本地屬性? – Toji 2008-11-04 19:50:57

1

您的文本框不更新的原因是您將它們綁定到StaticResource。顧名思義,這些資源是靜態的,不會發布更改通知。因爲綁定是一個MarkupExtension並且不是從DependencyObject派生的,所以你不能使用DynamicResource。

嘗試在控件上創建依賴屬性以引用Person和Job對象。

然後將UserControl的DataContext設置爲引用自身。

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

然後你可以使用點符號引用所需的性能。

<TextBox Text="{Binding Path=Person.Name" /> 
<TextBox Text="{Binding Path=Job.Address" /> 

或者使用source參數

<TextBox Text="{Binding Source=Person, Path=Name" /> 
<TextBox Text="{Binding Source=Job, Path=Address" />