2013-03-26 37 views
6

Đầu tiên mã những gì tôi đã bắt đầu từ:động liên kết với một "con đường" của tài nguyên

<ribbon:RibbonMenuButton IsEnabled="{Binding ForegroundIsConfigurable}" 
      SmallImageSource="{Binding Source={StaticResource imageSource}, 
          Path=Source, 
          UpdateSourceTrigger=OnPropertyChanged}"> 

Trong khi điều này ràng buộc được biên dịch và chạy tốt lý do tôi không hài lòng là imageSource thay đổi trong thời gian chạy.

StaticResource Markup Extension : Provides a value for any XAML property attribute by looking up a reference to an already defined resource. Lookup behavior for that resource is analogous to load-time lookup, which will look for resources that were previously loaded from the markup of the current XAML page as well as other application sources, and will generate that resource value as the property value in the run-time objects.

Kể từ imageSource giá trị thay đổi trong thời gian chạy tôi đã phải thay đổi StaticResource để DynamicResource. Nhưng tài sản Source không phải là một tài sản phụ thuộc và do đó đoạn mã sau sẽ nâng cao một lỗi runtime:

SmallImageSource="{Binding Source={DynamicResource imageSource}, 
        Path=Source, 
        UpdateSourceTrigger=LostFocus} 

Vì lý do đó tôi cần phải ràng buộc tài nguyên động trực tiếp đến SmallImageSource, mà là một tài sản phụ thuộc:

SmallImageSource="{DynamicResource imageSource}" 

Điều này một lần nữa sẽ gây ra lỗi thời gian chạy vì imageSource là loại Image. SmallImageSource hy vọng giá trị là loại ImageSource.

Giờ đây, người ta có thể đề xuất đặt ngữ cảnh dữ liệu thành tài nguyên động của tôi và ràng buộc thuộc tính một cách thích hợp. Nếu tôi làm như vậy, tôi sẽ hủy bỏ ràng buộc của tài sản IsEnabled trong đó có một DataContext khác.

Và theo như tôi biết, MultiBinding cũng không phải là giải pháp vì điều này cung cấp cơ chế liên kết thuộc tính với nhiều nguồn nhưng không cung cấp các thuộc tính khác nhau ràng buộc với các ngữ cảnh và nguồn khác nhau.

Trong khi suy nghĩ về cách tiếp tục, tôi nghĩ rằng may mắn là tôi có thể di chuyển thanh công cụ ImageSource thành IValueConverter. Trong bối cảnh dữ liệu đã cho của tôi RibbonMenuButton Tôi có một giá trị chuỗi với giá trị thích hợp mà thực sự cũng là nguồn của ImageSource của tôi.

Dù sao, tôi vẫn tự hỏi làm thế nào tôi sẽ giải quyết vấn đề nếu tôi không có cách tiếp cận khác, tức là nếu cả hai nguồn đều ở trong các bối cảnh dữ liệu khác nhau. Có điều gì tôi không thấy? Làm thế nào tôi có thể đảm bảo không giết ràng buộc khác bằng cách ghi đè lên DataContext và mặc dù ràng buộc chống lại một tài sản của một tài nguyên động?


Các imageSource là khá giống như ví dụ XAML trên DrawingImage msdn page.

<Image x:Key="imageSource"> 
    <Image.Source> 
    <DrawingImage> 
... 
+0

Bạn có thể đăng mã nơi bạn xác định tài nguyên "imageSource" không? –

Trả lời

1

Bạn có thể thử xác định "imageResource" làm ImageSource thay vì Image. Điều này làm việc cho tôi.

<r:RibbonWindow 
    x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
    xmlns:pc="clr-namespace:System.Windows.Media;assembly=PresentationCore"> 
    <Grid> 
     <Grid.Resources> 
      <pc:ImageSource x:Key="imageSource">your_image.png</pc:ImageSource> 
     </Grid.Resources> 
     <r:Ribbon> 
      <r:RibbonMenuButton 
       IsEnabled="{Binding ForegroundIsConfigurable}" 
       SmallImageSource="{DynamicResource imageSource}"> 
      </r:RibbonMenuButton> 
     </r:Ribbon> 
    </Grid> 
</r:RibbonWindow> 

Ngoài ra, bạn có thể đặt DataContext của RibbonMenuButton mà không ghi đè IsEnabled bằng cách sử dụng liên kết ElementName như sau.

<r:RibbonWindow x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid x:Name="root"> 

     <Grid.Resources> 
      <Image x:Key="imageSource" Source="{Binding myImageSource}"/> 
     </Grid.Resources> 

     <r:Ribbon> 
      <r:RibbonMenuButton DataContext="{DynamicResource imageSource}" 
       IsEnabled="{Binding ElementName=Root, Path=DataContext.ForegroundIsConfigurable}" 
       SmallImageSource="{Binding Source}"/> 
     </r:Ribbon> 
    </Grid> 
</r:RibbonWindow> 
+0

Tôi nghĩ ý tưởng thứ hai có thể hoạt động. Sẽ thử vào ngày mai. Ý tưởng đầu tiên, tuy nhiên, sẽ không hoạt động. Tôi quên đề cập đến việc tôi tự vẽ hình ảnh, không có hình ảnh để liên kết tới. – Em1

+0

@ Em1 Về ý tưởng đầu tiên, bạn có thể cập nhật khoá hình ảnhSource của từ điển tài nguyên khi bạn có quyền truy cập vào nó từ mã vẽ hình ảnh của bạn. –

+0

Tôi vừa thử nghiệm phương pháp thứ hai. Đối với một số lý do nó không làm việc cho tôi với ElementName nhưng với RelativeSource. - Tôi vẽ hình ảnh trong XAML, tôi đã cập nhật câu hỏi liên quan đến điều đó. Tôi đã không gỡ lỗi vào vấn đề khi không thể thêm nội dung trực tiếp khi sử dụng ImageSource (thay vì Image.Source). – Em1

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