12

リソース (DynamicResource) にバインドし、そのリソースのプロパティにアクセスしたいのですが、それを行う方法はありますか?

(Visual Studio の xaml エディターでコンストラクターからの既定値を視覚化したいと考えています。これらは、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; }
}
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 に答える