質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

6370閲覧

XAMLでプロパティの添付プロパティを指定したい

lazex

総合スコア604

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/11/22 14:25

編集2016/11/23 03:25

XAML でプロパティの添付プロパティを指定したいです。
単純に添付プロパティを指定するなら

AClass の AProperty が添付プロパティで、Binding ソースの prop プロパティに添付プロパティが設定されています

その状態でこのように添付プロパティを指定したいです

prop.local:AClass.AProp

使う場所は Trigger の Property です

<Trigger Property="prop.local:AClass.AProperty" Value="True"></Trigger>

しかしこの記法ではエラーになります

どう書くべきでしょうか?

補足
prop は実際には既存のコントロールのプロパティで、 prop があるクラスをカスタマイズはできません

できない場合

DataTrigger とコンバーターを使った方法も試してみてうまくいかない箇所があったので、上記の書き方ができないなら以下の質問に答えてもらえればと思います。

<DataTrigger Binding="{Binding prop,Converter={StaticResource converter}}" Value="True"/>

このように Trigger を設定して、 converter で添付プロパティを返すようにしています

しかし、この場合は添付プロパティが更新されても prop 自体には変更がないためか、更新しても変化しません
ずっと初期の値のままです

変更を通知しようとしたのですが方法がわからず、 Binding を手動アップデートすることを考えたのですが、こちらも手動更新するために BindngExpression が必要なのに Binding した取得できずうまく行っていません

なんとかして添付プロパティの更新を反映させることはできないのでしょうか?


追記

うまく伝わっていないようなので、例をあげます

xaml

1<StackPanel local:AClass.A="a"> 2 <Label local:AClass.A="b"> 3 <Label.Resources> 4 <Style TargetType="Label"> 5 <Style.Triggers> 6 <!-- これは動く --> 7 <Trigger Property="local:AClass.A" Value="b"> 8 <Setter Property="Foreground" Value="Red"/> 9 </Trigger> 10 <!-- こっちは動かない --> 11 <Trigger Property="Parent.local:AClass.A" Value="a"> 12 <Setter Property="Background" Value="Blue"/> 13 </Trigger> 14 </Style.Triggers> 15 </Style> 16 </Label.Resources> 17 abcd 18 </Label> 19</StackPanel>

Label に添付プロパティが付与され Label の local:AClass.A をトリガにするならエラーはでていません

ですが StackPanel に添付プロパティが付与され Label の Parent プロパティを経由して StackPanel の local:AClass.A を見ようとするとエラーになります

C# コード側ですが、ここでいう StackPanel の添付プロパティを複数のイベントに応じて変更する View のコードです
ここは変更できません(Label にも同じ添付プロパティを付与するということは不可能ではないが避けたい)

今回のやりたいことで関係あるのは

cs

1AClass.SetA(stkpanel, "a");

でセットしているということくらいなので省略します
必要ならどういう箇所が必要かいっていただければと思います

また別例として、

xaml

1<ListView> 2 <ListView.Resources> 3 <Style TargetType="GridViewColumnHeader"> 4 <Style.Triggers> 5 <Trigger Property="Column.local:AClass.A" Value="a"> 6 <Setter Property="Foreground" Value="Blue"/> 7 </Trigger> 8 <Trigger Property="Column.local:AClass.A" Value="b"> 9 <Setter Property="Foreground" Value="Red"/> 10 </Trigger> 11 </Style.Triggers> 12 </Style> 13 </ListView.Resources> 14 <ListView.View> 15 <GridView> 16 <!-- カラムいろいろ --> 17 </GridView> 18 </ListView.View> 19</ListView>

ListView の GridViewColumnHeader の Trigger で Column につけられた添付プロパティを見たいというのもあります

よろしくおねがいします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2016/11/22 15:34

断片的な情報のため推測しなければいけないところが多く回答しにくいです。良ければコードビハインド側も提示してください。
lazex

2016/11/23 03:29

コードビハインドは prop の添付プロパティをイベント時にセットするだけでほぼ XAML によるものです。どういう点が必要かいっていただければ追記させていただきます。一応具体例をあげてみたのですがこれで足りますでしょうか?
Tak1wa

2016/11/23 04:53

「バインディングソースのpropプロパティ」このあたりの実体が私にはイメージが出来ないのでpropプロパティを含むコード一式を確認させて頂きたいなと思いました。代替案だせるかもです。
lazex

2016/11/23 05:47

追記箇所にある Parent や Column など既存のコントロールのプロパティを指して `prop` とよんでいます。なので prop が定義されたクラスはこちらで作ったものではなく Framework の一部です。そのため prop の実体は私にも詳しくわかりません。一応ソースはこれになるとおもうのですけど・・・。(Column) https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/GridViewColumnHeader.cs,8798e8ee76baf2e5,references
Tak1wa

2016/11/23 05:59

うーん、propって何?って感じです。ちょっと私が勘違いしているのかもしれません。他の方からの回答をお待ちください。
guest

回答1

0

こういうことかわかりませんが、Triggerで添付プロパティをTriggerに使用してプロパティを設定できたので記載します。
propがプロパティということであれば、「Grid.Row」を「prop.AClass.AProperty」に変更することでできたりしませんかね?
これでだめな場合、ViewModelの方に「prop.AClass.AProperty」を返すプロパティを作ってそれをBindingすると言う手法を私葉よく使います。

C#

1<Window x:Class="tera56191.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:tera56191" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="350" Width="525"> 9 <Grid> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="25"/> 12 <RowDefinition Height="25"/> 13 <RowDefinition Height="*"/> 14 </Grid.RowDefinitions> 15 <TextBox Grid.Row="0"> 16 <TextBox.Style> 17 <Style TargetType="TextBox"> 18 <Setter Property="Background" Value="LightGray"/> 19 <Style.Triggers> 20 <Trigger Property="Grid.Row" Value="1"> 21 <Setter Property="Background" Value="Pink"/> 22 </Trigger> 23 <Trigger Property="Grid.Row" Value="0"> 24 <Setter Property="Background" Value="Aqua"/> 25 </Trigger> 26 </Style.Triggers> 27 </Style> 28 </TextBox.Style> 29 </TextBox> 30 <TextBox Grid.Row="1"> 31 <TextBox.Style> 32 <Style TargetType="TextBox"> 33 <Setter Property="Background" Value="LightGray"/> 34 <Style.Triggers> 35 <Trigger Property="Grid.Row" Value="1"> 36 <Setter Property="Background" Value="Pink"/> 37 </Trigger> 38 <Trigger Property="Grid.Row" Value="0"> 39 <Setter Property="Background" Value="Aqua"/> 40 </Trigger> 41 </Style.Triggers> 42 </Style> 43 </TextBox.Style> 44 </TextBox> 45 <TextBox Grid.Row="2"> 46 <TextBox.Style> 47 <Style TargetType="TextBox"> 48 <Setter Property="Background" Value="LightGray"/> 49 <Style.Triggers> 50 <Trigger Property="Grid.Row" Value="1"> 51 <Setter Property="Background" Value="Pink"/> 52 </Trigger> 53 <Trigger Property="Grid.Row" Value="0"> 54 <Setter Property="Background" Value="Aqua"/> 55 </Trigger> 56 </Style.Triggers> 57 </Style> 58 </TextBox.Style> 59 </TextBox> 60 </Grid> 61</Window>

投稿2016/11/22 21:39

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazex

2016/11/23 03:00

Grid.Row のような Trigger をつける要素に直接添付プロパティがあると大丈夫ですが、prop を通すと使えませんでした Trigger 部分は XAML だけですませたかったのですが VM に手をくわえる必要がありますか
Hey_CH

2016/11/23 05:17

これはGridにGrid.Rowをつけてる場合の例ですが、同じようにしてAの値が取れませんかね? 取れたら同じ内容をDataTriggerでBindingしてやれば良いと思います。 <TextBox Text="{Binding Row, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}"/> (同じような拡張を作ろうかと思ったら思いのほか面倒でやめました)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問