2009-12-14 37 views
5

Tôi đang cố thêm các sự kiện và phần tử theo chương trình vào DataTemplate trong ứng dụng Silverlight 3.0. Tôi có một điều khiển người dùng với một thuộc tính phụ thuộc mà tôi muốn lấy mẫu được thiết lập, tinh chỉnh nó, và sau đó thiết lập phiên bản sửa đổi để kiểm soát bên trong.Làm thế nào để lập trình sửa đổi một DataTemplate?

Ý tưởng tôi có là lấy DataTemplate đi kèm, đọc XAML của nó, tinh chỉnh nó và sau đó sử dụng XamlReader để tạo một DataTemplate đã sửa đổi mà sau đó có thể được đặt thành điều khiển bên trong. Vấn đề với cách tiếp cận này là tôi không biết làm thế nào để có được những XAML từ mẫu originalal Ví dụ (nếu nó thậm chí còn có thể.):

protected virtual void OnItemTemplateChanged(DependencyPropertyChangedEventArgs e) 
{ 
    // Get the original Xaml from the set template 
    //string originalXaml = ??? 

    // Modify the template 
    string newXaml = originalXaml.Replace("foo", "bar"); // for example 

    // Create a new template from the modified XAML 
    DataTemplate newTemplate = (DataTemplate)XamlReader.Load(newXaml); 

    // Update the inner template 
    this._childDropdown.ItemTemplate = newTemplate; 
} 

Không ai biết một trong hai: 1) nếu có một cách để đọc XAML gốc, hoặc 2) một cách tiếp cận khác để sửa đổi DataTemplate theo chương trình.

Cảm ơn,

Trả lời

1

Bạn không thể thao tác các mẫu thông qua mã (xem tài liệu cho FrameworkTemplate). Gần nhất bạn sẽ nhận được là gọi LoadContent của DataTemplate để tạo một thể hiện của Xaml chứa nhưng bạn không thể sử dụng nó để thao tác các nội dung và không có cách nào bên trong Silverlight để chuyển đổi một lần nữa trở lại Xaml.

Điều gần nhất tôi nghĩ bạn có thể nhận được là làm cho đối tượng phụ thuộc của bạn một Uri trỏ đến tài nguyên Xaml chứa DataTemplate ban đầu.

Sau đó, bạn có thể tải tài nguyên này vào một XDocument và thao tác nó dưới dạng XML. Sau đó, bạn có thể sử dụng XamlReader để dụ DataTemplate và gán nó cho ItemTemplate.

+0

Tôi (miễn cưỡng) đã làm lại dự án của mình để nó không yêu cầu thao tác của DataTemplate. Nó không phải những gì tôi muốn nhưng ít nhất tôi không lãng phí thêm thời gian để cố gắng làm điều này. Cảm ơn, tôi hy vọng một phiên bản tương lai của Silverlight sẽ cho phép một số thao tác có lập trình của DataTemplate. –

+0

Tôi nghĩ rằng những gì tôi muốn xem như khả năng thay thế một ItemContainerGenerator ItemsControl với máy phát tùy chỉnh mà chúng tôi không thể vào lúc này, tôi sẽ phải tìm kiếm SL4 xem nếu nó cho phép điều đó. – AnthonyWJones

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