Как связать с динамическим ресурсом и указанием пути - PullRequest
9 голосов
/ 30 августа 2010

Я хочу привязать к ресурсу (DynamicResource) и получить доступ к свойствам этого ресурса, но есть ли способ сделать это?

(Я хочу визуализировать значения по умолчанию из конструктора в редакторе xaml в Visual Studio. Их нельзя увидеть при обращении к объекту через DataContext или через свойство, добавленное в мой класс Window ...)

Не работает xaml: (работает в composer, но не во время выполнения ...)

<Window ... >
    <Window.Resources>
        <local:MyClass x:Key="myResource"  />
    </Window.Resources>
    <StackPanel>
        <Button Content="{Binding Source={DynamicResource myResource} Path=Property1}" />
        <Button Content="{Binding Source={DynamicResource myResource} Path=Property2}" />
    </StackPanel>
</Window>

с классом (который, вероятно, должен реализовать INotifyPropertyChanged):

public class MyClass 
{
    public MyClass()
    {
        this.Property1 = "Ok";
        this.Property2 = "Cancel";
    }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Ответы [ 2 ]

20 голосов
/ 30 августа 2010

Это связано с тем, что расширение разметки DynamicResource можно использовать только для свойства зависимостей, потому что оно должно будет обновлять его при изменении ресурса. И Binding.Source не является свойством зависимости ...

В качестве обходного пути вы можете установить DataContext кнопки с помощью DynamicResource:

<Button DataContext="{DynamicResource myResource}" Content="{Binding Path=Property1}" />
<Button DataContext="{DynamicResource myResource}" Content="{Binding Path=Property2}" />
0 голосов
/ 12 ноября 2018

Злоупотребление DataContext несвязанного объекта, кажется, самый простой обходной путь.Если вам все еще нужен DataContext вашего элемента управления (кто-нибудь из MVVM?), Вы также можете создать невидимый вспомогательный FrameworkElement в другом месте:

<FrameworkElement Visibility="Collapsed" x:Name="ControlBrushGetter"  DataContext=" 
{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />

и позже ссылаться на него, используя имя в привязке:

<SolidColorBrush Opacity="0.8" 
Color="{Binding ElementName=ControlBrushGetter, Path=DataContext.Color}" />

Ваш дизайнер, скорее всего, будет жаловаться на невозможность разрешить "Color" в контексте "object", но он будет работать нормально во время выполнения.

...