2010-09-17 30 views

Trả lời

4

Hành vi này là do thiết kế. Ràng buộc chỉ hoạt động trên các thuộc tính phụ thuộc của các đối tượng phụ thuộc và MarkupExtension không phải là đối tượng phụ thuộc.

5

Đây là cách sử dụng không chính xác của DynamicResource MarkupExtension. Sửa nó sẽ là:

<Image Source="{DynamicResource VM.ImageKey}" /> 

Giả sử bạn có một nguồn tài nguyên với một "VM.ImageKey" chìa khóa định nghĩa ở đâu đó như thế này:

<Bla.Resources> 
    <BitmapImage x:Key="VM.ImageKey" UriSource="C:\Uri\To\Image.jpg" /> 
</Bla.Resources> 

Tuy nhiên nếu bạn muốn để ràng buộc đối với một số hình thức bất động sản hiện nay DataContext bạn không phải sử dụng DynamicResource nhưng Binding:

<Image Source="{Binding VM.ImageKey}" /> 

Giả sử hiện tại của bạn DataContext là một trường hợp mà có ap roperty gọi là VM một lần nữa có thuộc tính được gọi là ImageKey là loại có nguồn gốc là ImageSource.

+0

Ngoài ra, nếu ImageKey là một lĩnh vực tĩnh hoặc tài sản trên Lớp VM, bạn có thể sử dụng cú pháp {x: Static} để lấy nó: trong đó lcl là xmlns được định nghĩa cho VM clr- không gian tên. –

0

Nếu bạn muốn chỉ định khóa tài nguyên động, bạn nên chỉ định nó bằng cách sử dụng phần mở rộng đánh dấu ResourceKey - không chắc chắn nó có hỗ trợ các ràng buộc theo cách bạn muốn hay không. Xem here để biết thêm chi tiết.

3

Nó không thể hoạt động vì DyamicResource là MarkupExtension và không phải là dependency property. Databinding chỉ hoạt động với các thuộc tính phụ thuộc.

Tuy nhiên, có giải pháp thay thế gọn gàng. Tạo một lớp DynamicTextBlock mở rộng một TextBlock.

Các XAML:

<TextBlock x:Class="Rebtel.Win.App.Controls.DynamicTextBlock" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"/> 

Các codebehind:

public partial class DynamicTextBlock : TextBlock 
{ 
    public static readonly DependencyProperty TextKeyProperty = DependencyProperty.Register(
     "TextKey", typeof(string), typeof(DynamicTextBlock), new PropertyMetadata(string.Empty, OnTextKeyChanged)); 

    private static void OnTextKeyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var me = ((DynamicTextBlock)d); 
     if (e.NewValue != null) 
     { 
      me.TextKey = (string) e.NewValue; 
     } 
    } 

    public string TextKey 
    { 
     set { SetResourceReference(TextProperty, value); } 
    } 

    public DynamicTextBlock() 
    { 
     InitializeComponent(); 
    } 
} 

Cách sử dụng:

<local:DynamicTextBlock TextKey="{Binding TextKeyProperty}" /> 

Các TextKeyProperty sau đó trả về một chìa khóa có thể được tìm thấy trong các ResourceDictionary. Cách tiếp cận tương tự có thể được thực hiện cho một Image và thuộc tính Source của nó.

0

Tôi giả định rằng trong trường hợp này, VM.ImageKey đề cập đến thuộc tính trên nguồn dữ liệu có giá trị bạn muốn sử dụng làm khóa từ điển tài nguyên. Ý tưởng cho rằng nguồn dữ liệu của bạn có thể xác định hình ảnh nào được sử dụng bằng cách cung cấp khóa tài nguyên. (Hầu hết các câu trả lời khác trên trang này là không hữu ích, vì họ không may đã bỏ lỡ những gì bạn đang cố gắng làm, giả sử rằng bạn muốn sử dụng văn bản chữ "VM.ImageKey" làm khóa tài nguyên, điều mà tôi chắc chắn không phải là bạn đang yêu cầu.)

này dường như không được hỗ trợ, nhưng có cách tiếp cận khác có thể cho phép bạn chọn một nguồn tài nguyên hình ảnh thông qua một phím xác định bằng cách liên kết dữ liệu: https://stackoverflow.com/a/20566945/497397

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