2009-03-29 9 views
8

Tôi có một giá trị Danh sách với một ResourceKey và một chú thích, các giá trị này là cả hai chuỗi. Tài nguyên là tên của tài nguyên thực được xác định trong từ điển tài nguyên. Mỗi biểu tượng ResourceKey này là của Canvas.Ràng buộc một thuộc tính chuỗi dữ liệu văn bản vào một khóa StaticResource

<Data ResourceKey="IconCalendar" Caption="Calendar"/> 
<Data ResourceKey="IconEmail" Caption="Email"/> 

Sau đó, tôi có chế độ xem danh sách có biểu tượng dữ liệu với nút và chú thích văn bản bên dưới nút. Những gì tôi muốn làm là hiển thị tài nguyên tĩnh tài nguyên như nội dung cho nút.

<ListView.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Button Content="{Binding ResourceKey}" Template="{StaticResource RoundButtonControlTemplate}"/> 
      <TextBlock Grid.Row="1" Margin="0,10,0,0" Text="{Binding Caption}" HorizontalAlignment="Center" FontSize="20" FontWeight="Bold" /> 
     </Grid> 
    </DataTemplate> 
</ListView.ItemTemplate> 

Tôi nghĩ rằng tôi đã cố gắng mỗi hoán vị với ràng buộc StaticResource, vv

Tôi mở cửa cho giải pháp thay thế, tôi biết nó có thể được dễ dàng hơn để chỉ có một hình ảnh và thiết lập thuộc tính nguồn.

Cảm ơn

Trả lời

10

Sau khi có một chút suy nghĩ tôi kết thúc bằng cách sử dụng một ValueConvertor như vậy:

class StaticResourceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var resourceKey = (string)value; 

     return Application.Current.Resources[resourceKey]; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new Exception("The method or operation is not implemented."); 
    } 
} 

và các ràng buộc vào nút trở

<Button Content="{Binding ResourceKey, Converter={StaticResource resourceConverter}}" /> 
+1

Sử dụng FindResource thay vì truy cập chỉ mục []: trả lại ứng dụng.Current.FindResource (value); nó sẽ tìm kiếm trong tất cả các tài nguyên, không chỉ trong app.xaml – Liero

+0

Không biết tại sao, nhưng tôi phải sử dụng _App_.Current.Resources như trái ngược với Application.Current.Resources – Danielson

2

Ở đây tôi đã có một phiên bản cải tiến của câu trả lời của @dvkwong (cùng với bản chỉnh sửa của @Anatoliy Nikolaev):

class StaticResourceConverter : MarkupExtension, IValueConverter 
{ 
    private Control _target; 


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var resourceKey = (string)value; 

     return _target?.FindResource(resourceKey) ?? Application.Current.FindResource(resourceKey); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var rootObjectProvider = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider; 
     if (rootObjectProvider == null) 
      return this; 

     _target = rootObjectProvider.RootObject as Control; 
     return this; 
    } 
} 

sử dụng:

<Button Content="{Binding ResourceKey, Converter={design:StaticResourceConverter}}" /> 

Sự thay đổi chính ở đây là:

  1. Bộ chuyển đổi bây giờ là một System.Windows.Markup.MarkupExtension để nó có thể được sử dụng trực tiếp mà không được công bố là một nguồn tài nguyên.

  2. Trình chuyển đổi là nhận thức theo ngữ cảnh, vì vậy nó sẽ không chỉ tìm kiếm trong tài nguyên của ứng dụng mà còn tìm kiếm tài nguyên cục bộ (cửa sổ hiện tại, điều khiển người dùng hoặc trang v.v.).

+0

TIL về MarkupExtension, đó là một ngày tốt lành . – amnesia