2013-03-26 3 views
6

Первый код, что я начиная с:Динамическое связывание с «Path» ресурса

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

Хотя это связывание компилирует и отлично работает причину я не удовлетворен является то, что imageSource изменения во время выполнения.

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.

Так как изменение imageSource значение во время выполнения я должен был изменить StaticResource к DynamicResource. Но свойство Source не является свойство зависимостей и, таким образом, следующий код вызовет ошибку во время выполнения:

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

По этой причине, мне нужно, чтобы связать динамический ресурс непосредственно SmallImageSource, который является свойством зависимости:

SmallImageSource="{DynamicResource imageSource}" 

Это снова вызовет ошибку времени выполнения, поскольку imageSource является типом Image. SmallImageSource ожидает, что значение будет ImageSource.

Теперь можно предложить установить контекст данных в свой динамический ресурс и соответствующим образом привязать его. Если я это сделаю, я убью привязку свойства IsEnabled, у которого есть еще DataContext.

И, насколько я знаю, MultiBinding также не является решением, поскольку это обеспечивает механизм привязки свойства к нескольким источникам, но не обеспечивает привязки разных свойств к различным контекстам и источникам.

Задумываясь о том, как это сделать, мне пришло в голову, что, к счастью, я могу переместить ImageSource rigmarole в IValueConverter. В данном контексте данных моего RibbonMenuButton у меня есть строковое значение с соответствующим значением, которое на самом деле также является источником моего ImageSource.

Во всяком случае, мне все же интересно, как бы я решил проблему, если бы у меня не было другого подхода, т. Е. Если оба источника были в разных контекстах данных. Есть ли что-то, чего я не вижу? Как я могу гарантировать, чтобы не убить другое связывание, перезаписав DataContext и хотя привязав к свойству динамического ресурса?


imageSource довольно так же, как в примере XAML на DrawingImage msdn page.

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

Можете ли вы разместить код, на котором вы определяете ресурс imageSource? –

ответ

1

Вы можете попробовать определение "imageResource" как ImageSource вместо Image. Это работает для меня.

<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> 

Кроме того, вы можете установить DataContext вашего RibbonMenuButton без перекрывая IsEnabled с помощью связывания, как следует за ELEMENTNAME.

<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

Я думаю, что вторая идея может работать. Попробуем это завтра. Первая идея, однако, не сработает. Я забыл упомянуть, что сам рисую изображение, нет изображения для ссылки. – Em1

+0

@ Em1 Что касается первой идеи, вы можете обновить ключ imageSource словаря ресурсов на лету, если у вас есть доступ к нему из кода, который рисует ваши изображения. –

+0

Я только что проверил второй подход. По какой-то причине это не сработало для меня с ElementName, но с RelativeSource. - Я рисую изображение в XAML, я обновил этот вопрос. Я не отлаживал проблему, что при непосредственном использовании ImageSource (вместо Image.Source) содержимое не может быть добавлено. – Em1

Смежные вопросы