Как выполнить привязку с динамическим ресурсом и указать путь

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

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

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

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

person erikH    schedule 30.08.2010    source источник


Ответы (2)


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

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

<Button DataContext="{DynamicResource myResource}" Content="{Binding Path=Property1}" />
<Button DataContext="{DynamicResource myResource}" Content="{Binding Path=Property2}" />
person Thomas Levesque    schedule 30.08.2010
comment
+1, похоже, это более чистая работа, и я сделал это с хорошим эффектом - person marr75; 30.08.2010
comment
Может ли кто-нибудь объяснить, почему это будет работать только после запуска родительского события windows Loaded? Даже при использовании кода API и т. Д. TryFindResource() он вернет ожидаемый ресурс? - person Alex Hope O'Connor; 04.04.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}" />

Ваш дизайнер, скорее всего, будет жаловаться на то, что не может разрешить «Цвет» в контексте «объекта», но он будет нормально работать во время выполнения.

person Patrick Kursawe    schedule 12.11.2018