2012-04-18 24 views
5

Tôi đang tạo một bản trình diễn đơn giản để tìm hiểu cách tạo điều khiển người dùng có thể ràng buộc. Tôi đã tạo ra một lớp đơn giản:Làm cách nào để bạn thực hiện Điều khiển người dùng XAML tùy chỉnh có thể ràng buộc?

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

Và một điều khiển người dùng rất đơn giản:

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

Những gì tôi muốn biết là những gì tôi cần phải làm để có thể sử dụng cho người sử dụng kiểm soát trong bối cảnh như một điều khiển bình thường. Tôi có thể thêm video này vào các MainWindow:

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

và sau đó tôi có thể giải quyết nó thông qua mã phía sau và thêm giá trị:

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

Tôi muốn để có thể tạo ra một thể hiện của lớp Person và chỉ cần gắn điều khiển trên cửa sổ chính với lớp Person.

Trả lời

5

Một vài điều bạn cần làm để thực hiện công việc này.

Trong bạn mã phía sau, thêm một tài sản phụ thuộc cho đối tượng Person bạn muốn kiểm soát của bạn biết về:

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

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

Trong XAML của bạn, thiết lập của bạn code-behind như bối cảnh dữ liệu của bạn và thêm ràng buộc với đối tượng người của bạn:

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

Bây giờ, bất cứ khi nào thuộc tính Person được đặt, kiểm soát của bạn sẽ tự cập nhật với họ và tên có liên quan đến cá nhân.

+1

Có thể có ích khi không thay đổi 'DataContext', đặc biệt nếu' UserControl' này kết thúc bằng 'ContentControl'. Một giải pháp đơn giản cho điều này sẽ là đặt tên cho điều khiển người dùng và tham chiếu nó trong các ràng buộc thông qua 'ElementName'. – user7116

+0

sixlettervariables là đúng. Hãy xem [giải thích] này (http://www.scottlogic.co.uk/blog/colin/2012/02/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight /) với lý do. – LPL

+0

Tôi đã thực hiện thay đổi sáu bản biến đổi được đề xuất trong bài đăng gốc ở trên. – Curtis

2

những gì bạn muốn gọi là Thuộc tính phụ thuộc mà bạn có thể liên kết với nó từ xaml.
1-tạo lĩnh vực này

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

2-tạo tài sản

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

3- bạn có thể sử dụng nó trong XAML để ràng buộc nó hoặc chỉ sử dụng nó

<local:YourControlName FirstName="john"/> 

<local:YourControlName FirstName="{Binding MyFirstName}"/> 
  • sử dụng Resharper sẽ giúp bạn tạo mã sạch và có IntelliSense rất mạnh mẽ
+0

cảm ơn bạn, có vẻ như những gì tôi đã bỏ lỡ. Tôi sẽ làm việc cùng nhau. –

+0

một câu hỏi khác nếu tôi có thể - tôi có thể ràng buộc toàn bộ quyền kiểm soát thay vì chỉ một thuộc tính duy nhất không? –

Các vấn đề liên quan