12

我想绑定到资源(DynamicResource)并访问该资源的属性,但是有没有办法做到这一点?

(我想在 Visual Studio 的 xaml 编辑器中可视化构造函数的默认值。通过 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; }
}
4

2 回答 2

25

这是因为DynamicResource标记扩展只能用于依赖属性,因为如果资源发生变化,它需要更新它。并且Binding.Source不是依赖属性...

作为一种解决方法,您可以使用以下命令设置DataContext按钮的DynamicResource

<Button DataContext="{DynamicResource myResource}" Content="{Binding Path=Property1}" />
<Button DataContext="{DynamicResource myResource}" Content="{Binding Path=Property2}" />
于 2010-08-30T09:17:43.953 回答
1

滥用不相关对象的 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}" />

您的设计师很可能会抱怨无法在“对象”的上下文中解析“颜色”,但它会在运行时正常工作。

于 2018-11-12T08:35:34.297 回答