2009-03-03 24 views
30

Làm thế nào tôi có thể đặt DataContext trên lưới điện của tôi trong XAML, thay vì trong các nhà xây dựng?Silverlight - Thiết DataContext trong XAML hơn là trong xây dựng?

Dưới đây là cách tôi làm điều đó trong các nhà xây dựng (LayoutRoot là XAML Lưới được định nghĩa trong XAML):

this.LayoutRoot.DataContext = this.HPVM; 

Tôi muốn làm điều đó ngay trong XAML, nhưng tôi không biết làm thế nào để tham chiếu đối tượng HPVM trong XAML. HPVM là tài sản công khai trên lớp USerControl.

Nó hoạt động tốt như đã liệt kê ở trên, nhưng một lần nữa, tôi chỉ muốn biết làm thế nào để thuộc tính của lớp UserControl trong XAML, chứ không phải lúc nào cũng cần phải làm điều đó trong mã.

Dưới đây là tất cả các mã liên quan:

<UserControl x:Class="SilverlightApplication1.SLHolePattern" x:Name="HolePatternsControl" 
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"  
    xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls" 
    xmlns:local="clr-namespace:SilverlightApplication1"  
    xmlns:GeoPatterns="clr-namespace:GeoPatterns" 
    Height="700"> 


    <UserControl.Resources> 
    ... 

Và đây là nhà xây dựng của tôi, nơi DataContext hiện đang thiết lập:

namespace SilverlightApplication1 
{ 
    public partial class SLHolePattern : UserControl, INotifyPropertyChanged 
    { 
     public HolePatternsViewModel HPVM; 

     public SLHolePattern() 
     { 
      InitializeComponent(); 

      this.HPVM=new HolePatternsViewModel(); 
      this.LayoutRoot.DataContext = this.HPVM; 
      ...more code here 
     } 

Tất cả đều hoạt động tốt, nhưng tôi chỉ muốn tìm hiểu làm thế nào để đặt DataContext trong XAML, không phải trong mã.

Trả lời

24

Câu trả lời Chris cho công trình tốt. Tôi đã thử nghiệm và nó đã làm việc cho tôi. Bạn có thể khởi tạo lớp của bạn trong XAML (trong UserControl.Resources) và sau đó liên kết văn bản dữ liệu với một tài nguyên tĩnh.

đang Follow:

 

<UserControl ...> 
    <UserControl.Resources> 
     <myNS:MyClass x:Name="TheContext" x:Key="TheContext"></myNS:MyClass> 
    </UserControl.Resources> 
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" > 
     <TextBlock Text="{Binding Path=Field1}"> 
     </TextBlock> 
    </Grid> 
</UserControl> 
 
+0

Nếu tôi khởi tạo lớp ViewModel trong XAML, tôi vẫn có thể tham khảo trong hàm dựng mã phía sau không? Lý do tôi hỏi là tôi hiện đang thiết lập một số giá trị trên ViewModel trong hàm dựng trước khi biểu mẫu được hiển thị cho người dùng. – MattSlay

+3

Có, bạn có thể. Bạn có thể làm như sau: var aCustomer = this.Resources ["Cust"] làm Khách hàng; aCustomer.Name = "abc"; – Klinger

+2

Tôi quên thêm thuộc tính x: Tên. x: Các công việc chính trong XAML và x: Tên làm cho đối tượng hiển thị với mã. – Klinger

2

thử một cái gì đó như thế này .....

<Grid DataContext="{Binding Path=HPVM}"> 
</Grid> 

nơi HPVM là thành viên của công chúng về này -> hình thức của bạn, vv

Tạo thể hiện của lớp học của bạn trong XAML, bởi thêm một cái gì đó như thế này để phần tài nguyên của bạn .... (đừng quên để thêm không gian tên xmlns của bạn)

<my:bogart x:Key="franken"/> 

sau đó, ràng buộc bối cảnh dữ liệu đến các tài nguyên tĩnh bạn vừa thêm ....

<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}"> 
    <TextBox Background="Red" Foreground="White" Text="{Binding Path=sum}" /> 
</Grid> 
+0

Không hoạt động. Có cần phải có một con đường bằng cách nào đó mà nói HPVM ở đâu. trong phương pháp mã, đó là "cái này". một phần. HPVM là tài sản trên lớp. Tôi không thể tìm ra đúng cách để tham khảo lớp instantiated để có được HPVM. – MattSlay

+0

Tôi đã thêm nhiều mã trong câu hỏi gốc. – MattSlay

+0

Ví dụ mã thứ hai không hoạt động, nhưng * tạo * đối tượng trong XAML. Nó vẫn không giải quyết các cá thể truy cập tạo ra các đối tượng tạo ra từ XAML. Tốt nhất tôi có thể nói nó không thể được thực hiện. Bạn phải đặt DataContext từ mã nếu đối tượng được tạo trong mã. – MattSlay

0

Điều này là không thể (Có thể trong WPF với {Binding RelativeSource={RelativeSource Self}}, nhưng Silverlight bị hạn chế hơn.

Bạn phải làm điều đó thông qua mã.

6
<UserControl.DataContext> 
    <vm:ThisUCViewModel /> 
</UserControl.DataContext> 
10

Các con quái vật sau đây làm việc trong Silverlight 4

<UserControl 
    DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}"> 
+2

Tôi vừa ném lên một chút, trong miệng. – Cheeso

1

Trong Silverlight 4, tôi đã có thể làm việc này bằng cách làm như sau:

Cung cấp cho Trang/UserControl một x: Name = "myPage"

Trong điều khiển ràng buộc sử dụng bình thường cú pháp bidning tử của bạn.Trong trường hợp của tôi, tôi muốn liên kết với một bộ sưu tập quan sát các đối tượng trong mã của tôi đằng sau cho tài sản ItemsSource của tôi:

<ComboBox 
    ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay} 

Tôi đã không cố gắng này với DataContext nhưng biết bạn có thể làm yếu tố để yếu tố bắt buộc đối với DataContext như tôi làm điều này cho Grids có bối cảnh dựa trên mục đã chọn của một số thả xuống khác trên trang.

+0

Rực rỡ! Điều đó chắc chắn đã sửa nó cho tôi. Cảm ơn rất nhiều. – SGarratt

0
<UserControl.Resources> 
    <ResourceDictionary> 
    <vm:YourModelx:Key="myModel"/> 
    </ResourceDictionary> 
</UserControl.Resources> 
<UserControl.DataContext> 
    <Binding Source="{StaticResource myModel}"/> 
</UserControl.DataContext> 
+0

Bạn chỉ cần thêm Jacfay

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