C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

WPF、TextBlockにTrigger&Command

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■86318 / inTopicNo.1)  WPF、TextBlockにTrigger&Command
  
□投稿者/ かい (5回)-(2018/01/17(Wed) 22:41:38)

分類:[.NET 全般] 

2018/01/17(Wed) 23:57:02 編集(投稿者)
お世話になっています。
C#及びVisualStudio2017を使用しています。

※編集しました。

掲題の通りです。
Itemscontrolで連なったTextBlockのそれぞれに、TriggerとCommandの両方を指定する方法をご存じであればお教え下さい。

Itemscontrolで使用しなければ、以下のソースで動くのですが、
Itemscontrol内ではCommandが効かない状態(反応が無い)となっています

イメージは以下の通りです。
<ItemsControl ItemsSource="{Binding Path=TitleList}"
          Grid.Row="0" Grid.Column="0"
          >
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"></StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Padding" Value="10"/>
                        <Setter Property= "Foreground" Value="White"/>
                        <Style.Triggers>
                            <Trigger Property ="IsMouseOver" Value="True">
                                <Setter Property= "Foreground" Value="Red"/>
                                <Setter Property="FontSize" Value="20"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
		
		<!--以下が効かなくなっている。ItemsControl内でなければ普通に動く-->
		<TextBlock.InputBindings>
			<MouseBinding Command="{Binding Path=Command}" MouseAction="LeftClick"/>
		</TextBlock.InputBindings>
                
		<Run Text="{Binding Path=Title}"></Run>
            </TextBlock>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

引用返信 編集キー/
■86322 / inTopicNo.2)  Re[1]: WPF、TextBlockにTrigger&Command
□投稿者/ Hongliang (601回)-(2018/01/18(Thu) 09:06:14)
このItemsControlのDataContextは、以下のようなクラス構造でしょうか?
class Root {
  public List<Content> TitleList { get; set; }
  public ICommand Command { get; set; }
}
class Content {
  public string Title { get; set; }
}

TextBlockのDataContextは個々のContentが割り当てられるので、
{Binding Path=Command}であればContentクラスのCommandプロパティを参照しようとします。
{Binding Path=Title}がContentクラスのTitleプロパティを参照するように。

以前DataContext継承について長々書いてみたことがあったのでご参考に。
https://social.msdn.microsoft.com/Forums/ja-JP/1cbd5bc2-2867-4d93-b730-095209012f90/listbox

引用返信 編集キー/
■86327 / inTopicNo.3)  Re[2]: WPF、TextBlockにTrigger&Command
□投稿者/ かい (7回)-(2018/01/19(Fri) 08:12:31)
回答ありがとうございます。
仰る通りのクラス構造です。ここにCommandが無いことが原因なのですね。

リンク先を拝見しました。
RelativeSourceを使用して祖先検索を行うことで本事象を回避しました。
(Commandクラスを作ってそこにCommandを集約、
TitleListクラスに継承させるほうのは筋が悪いと判断)

ありがとうございました。


解決済み
引用返信 編集キー/
■86328 / inTopicNo.4)  Re[3]: WPF、TextBlockにTrigger&Command
□投稿者/ ぶなっぷ (160回)-(2018/01/19(Fri) 11:10:09)
Commandでやっている処理が分からないので、話しづらいんですが。。。

もし、Commandでやっている内容が Hongliangさんの例における
Contentクラスのデータ処理であるなら、

class Root {
  public List<Content> TitleList { get; set; }
}
class Content {
  public string Title { get; set; }
  public ICommand Command { get; set; }
}

とする方が自然ですよ(^-^)
そうすれば、RelativeSourceを使用して祖先検索を行うとか
面倒なことが不要になります。

引用返信 編集キー/
■86335 / inTopicNo.5)  Re[4]: WPF、TextBlockにTrigger&Command
□投稿者/ かい (8回)-(2018/01/20(Sat) 00:40:04)
お世話になっています。

構造を明かしますと、
提示頂いたソースにおけるクラス「Root」はViewModelです。
そしてCommandは画面の共通処理を格納しています。画面を閉じる、等。
(ViewModelにいくつかのCommandがあり、このViewModelを継承して機能毎の実装を行っています)

仰る通りContentにCommandを入れてしまうと、
ViewModel及びViewModelのフィールドの二か所に共通処理が存在することになります。

そこで「ベースとなるViewModelにベースとなるCommandが実装されている」という形を守る方針としました。
※私は設計の訓練を受けたことがありません。これが標準かはわかりません。

よくわからない場合は仰ってください。githubのリポジトリをお伝えします。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ