2012-04-18 63 views
5

我正在做一個簡單的演示來學習如何創建一個可綁定的用戶控件。我創建了一個簡單的類:如何使自定義XAML用戶控件可綁定?

class Person 
{ 
    public string firstName; 
    public string lastName;  
    public Person(string first, string last) 
    { 
     firstName = first; 
     lastName = last; 
    } 
} 

和一個非常簡單的用戶控制:

<UserControl x:Class="Example.ExampleHRControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBlock x:Name="textFirstName"></TextBlock> 
     <TextBlock x:Name="textLastName"></TextBlock> 
    </Grid> 
</UserControl> 

我想知道什麼是我需要什麼才能做才能夠使用用戶像正常控制一樣控制在上下文中。我可以添加這個到MainWindow

<local:ExampleHRControl x:Name="Hr1"></local:ExampleHRControl> 

,然後我可以通過後面的代碼解決這個問題,並添加值:

Hr1.textFirstName.Text = "John"; 
Hr1.textLasttName.Text = "Doe"; 

我寧願能夠創建類Person的實例並簡單地將主窗口上的控件綁定到Person類。

回答

5

你需要做一些事情來完成這項工作。

在你的後臺代碼,添加一個依賴屬性,你希望你的控制要知道Person對象有關:

public static readonly DependencyProperty PersonProperty = 
          DependencyProperty.Register("Person", typeof(Person), 
                 typeof(ExampleHRControl)); 

    public Person Person 
    { 
     get { return (Person)GetValue(PersonProperty); } 
     set { SetValue(PersonProperty, value); } 
    } 

在XAML中,設置您的代碼隱藏爲您的數據上下文,並添加綁定到您的個人目標:

<UserControl x:Class="Example.ExampleHRControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     x:Name="This"> 
    <Grid> 
     <TextBlock x:Name="{Binding Path=Person.FirstName, ElementName=This}"/> 
     <TextBlock x:Name="{Binding Path=Person.LastName, ElementName=This}"/> 
    </Grid> 
</UserControl> 

現在,每當人物屬性設置,你的控制將與關聯到人名和姓進行自我更新。

+1

不改變'DataContext'可能是有益的,特別是如果這個'UserControl'最終成爲'ContentControl'。一個簡單的解決方案是命名用戶控件並通過'ElementName'在綁定中引用它。 – user7116 2012-04-18 21:32:11

+0

sixlettervariables是正確的。看看這個[解釋](http://www.scottlogic.co.uk/blog/colin/2012/02/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight /) 由於這個原因。 – LPL 2012-04-18 21:57:05

+0

我已經在上面的原始發佈中進行了六個字母變量推薦的更改。 – Curtis 2012-04-19 14:53:01

2

你想叫做Dependancy Property你可以從xaml綁定到它。
1創建領域

public static readonly DependencyProperty FirstNameProperty = 
    DependencyProperty.Register(
    "FirstName", typeof(Strin), 

2 - 創建屬性

public String FirstName 
{ 
    get { return (String)GetValue(FirstNameProperty); } 
    set { SetValue(FirstNameProperty, value); } 
} 

3-你可以用它在XAML綁定,或只是用它

<local:YourControlName FirstName="john"/> 

<local:YourControlName FirstName="{Binding MyFirstName}"/> 
  • 使用Resharper將幫助您創建一個乾淨的代碼並具有非常強大的智能感知
+0

謝謝,這看起來像我失蹤。我會努力把它們放在一起。 – 2012-04-18 20:54:30

+0

如果可以,還有另一個問題 - 我可以綁定整個控件而不僅僅是一個屬性嗎? – 2012-04-18 21:47:58

相關問題