2009-12-23 33 views
11

Tôi có một DataTemplate mà tôi muốn tìm bằng cách sử dụng FrameworkElement.FindResource(). Để làm điều đó tôi cần phải có một chìa khóa trên mẫu dữ liệu.WPF DataTemplate - x: Khoá vs DataType = "{x: Loại XXXX")

Vấn đề là x: khóa và gán kiểu dữ liệu loại trừ lẫn nhau. (Reference)

Vì vậy, khi tôi đặt Kiểu dữ liệu cho mẫu của mình, làm cách nào để tìm giá trị Khóa? Có công thức nào chuyển đổi DataTemplate thành một chuỗi cho Khóa không?

(Đối với inquries là tại sao tôi cần phải nhận được DataTemplate tìm thấy bằng Resource thấy điều này question

Trả lời

19

x:.. Chính có vẻ là một đối tượng kiểu System.Windows.DataTemplateKey Vì vậy, bạn có thể "tạo ra" chìa khóa cho . tài nguyên của bạn với new DataTemplateKey(typeof(myType))FindResource sẽ làm việc với chính này, vì TemplateKey.Equals đã được ghi đè

Dưới đây là một ví dụ ứng dụng rất đơn giản:.

XAML:

<Window ...> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type TextBlock}"> 
     </DataTemplate> 
    </Window.Resources> 

    <Button Click="Button_Click">Test</Button> 
</Window> 

codebehind:

//using ... 

namespace WpfCsApplication1 { 
    public partial class Window1 : Window { 
     public Window1() { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) { 
      var key = new System.Windows.DataTemplateKey(typeof(TextBlock)); 
      var r = (DataTemplate)this.FindResource(key); 

      MessageBox.Show(r.ToString()); // to show that it worked 
     } 
    } 
} 
+0

này sẽ rất tốt nhưng là một giải pháp C#. Có cách nào để làm điều này từ XAML trực tiếp? Ví dụ tôi có một mẫu DataType mà tôi đang sử dụng ở khắp mọi nơi, nhưng tôi cũng muốn sử dụng nó như một giá trị trong một TemplateSelector. Điều tương tự ... nếu tôi thêm một khóa, tôi sẽ mất kết hợp kiểu dữ liệu. Nếu tôi không, tôi không chắc chắn làm thế nào để ref nó trong XAML. – MarqueIV

+1

@MarqueIV: Bạn có thể tham chiếu nó trong XAML bằng cách sử dụng '{x: Type ...}' làm khóa. – Heinzi

+0

Đã thử ... DataTemplate = "{StaticResource {x: Loại vm: IOPBase}}" nhưng nó không hoạt động. Sự cố. (FYI, tôi biết loại là chính xác như các mẫu có 'DataType = "{x: Loại vm: IOPBase}"' mà hoạt động tốt.) Suy nghĩ? – MarqueIV

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