35

Text-block Background を別のクラスの静的変数にバインドしようとするこの xaml ファイルがありますが、どうすればこれを達成できますか?

ばかげているかもしれませんが、Win フォームから移動したばかりで、少し迷っています。

ここに私が意味するものがあります:

<TextBlock Text="some text"
           TextWrapping="WrapWithOverflow"
           Background="{Binding Path=SomeVariable}" />
4

3 に答える 3

14

実際には静的プロパティにバインドすることはできません(INotifyPropertyChangedはインスタンスでのみ意味があります)ので、これで十分です...

{x:Static my:MyTestStaticClass.MyProperty}  

または例

<TextBox Text="{x:Static my:MyTestStaticClass.MyProperty}" Width="500" Height="100" />  

必ず含めてください-つまり、XAMLで次のようにnamespace定義しますmyxmlns:my="clr-namespace:MyNamespace"


編集:コードからのバインディング
(この部分にはいくつかの回答が混在しているため、展開するのが理にかなっていると思いました。1か所にまとめてください)


OneTimeバインディング:

あなたはただ使うことができますtextBlock.Text = MyStaticClass.Left(それを配置する場所に注意してください、post-init)

TwoWay(またはOneWayToSource) バインディング:

Binding binding = new Binding();
//binding.Source = typeof(MyStaticClass);
// System.InvalidOperationException: 'Binding.StaticSource cannot be set while using Binding.Source.'
binding.Path = new PropertyPath(typeof(MyStaticClass).GetProperty(nameof(MyStaticClass.Left)));
binding.Mode = BindingMode.TwoWay;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
this.SetBinding(Window.LeftProperty, binding);

...もちろん、コードから Binding を設定している場合は、XAML のバインディングをすべて削除します。

OneWay(ソースからのプロパティの変更):

また、ソース プロパティの変更時にターゲット (つまり、この場合はコントロールのプロパティ、Window.Left) を更新する必要がある場合、それは静的クラスでは実現できません (上記の私のコメントによると、必要になるでしょう)。実装されているので、ラッパークラスを使用してINotifyPropertyChanged実装し、それをINotifyPropertyChanged関心のある静的プロパティに配線することができます(静的プロパティの変更を追跡する方法を知っている場合、つまり、これはこの時点からの「設計」の問題です。すべてを 1 つの「非静的」クラスに再設計して配置することをお勧めします)。

于 2013-04-06T19:09:15.597 に答える