---
# System prepended metadata

title: 2023/05/16 戻るボタン修正

---

# 2023/05/16 戻るボタン修正

Margin, Command, DoProcessのプロパティ値の指定をViewのコントロールへ直接指定からControlTemplateへ移行したら動くようになった
![](https://hackmd.io/_uploads/rJPi1pxBh.png)
![](https://hackmd.io/_uploads/rk5pJ6eSn.png)

#### わたし：
>リソースファイルのTemplate定義を適用したView上のコントロールに、Template定義と重複してプロパティに値を設定するとどちらが適用されますか

#### ChatGPT：
>View 上のコントロールには、以下のルールに基づいてプロパティの値が適用されます。
>
>1. 直接指定された値: コントロールの XAML 定義で直接プロパティに値が指定されている場合、その値が優先されます。例えば、以下のようなコードで `Button` の `Background` プロパティに直接値が指定されている場合、この値が適用されます。
>
>   ```xaml
>   <Button Background="Red" />
>   ```
>
>2. スタイルで指定された値: コントロールにスタイルが適用されている場合、スタイルでプロパティの値が指定されている場合、その値が適用されます。スタイルは、`Style` 要素内やリソースとして定義されている場合など、様々な方法で指定できます。
>
>3. テンプレートで指定された値: コントロールにテンプレートが適用されている場合、テンプレート内でプロパティの値が指定されている場合、その値が適用されます。テンプレートは、`ControlTemplate` 要素内に定義されている場合など、コントロールの外観や構造を定義するために使用されます。
>
>上記のルールによって、プロパティに複数の場所から値が設定されている場合、より具体的な指定が優先されます。具体的な指定とは、より近い位置で指定された値や、より上位の要素で指定された値などです。
>
>ただし、異なる場所でプロパティに値を指定した場合、同じプロパティに対して直接指定とテンプレート定義が重複している場合、直接指定の値が優先されます。

(中略)
#### わたし：
>Command プロパティをControlTemplateの側に記述したところ、意図通りにCommandが実行されました。違いはなんだったのでしょうか。

#### ChatGPT：
> ac:ButtonControl の Command プロパティを ControlTemplate の側に記述すると、ControlTemplate 内で定義されたコントロールがそのプロパティを直接参照することができます。一方、ac:ButtonControl の親要素である Grid 内に ButtonControl を配置し、Command プロパティを直接指定した場合、ControlTemplate の内部では ButtonControl のプロパティにアクセスするための名前スコープが異なります。
>
>ControlTemplate 内部のコントロールは、そのテンプレートのスコープ内で評価されます。テンプレート内では、TargetType に指定された型 (ac:ButtonControl であれば) のプロパティに直接アクセスできます。一方、ControlTemplate を使用する親要素では、テンプレート内のコントロールのプロパティに直接アクセスすることはできません。
>
>したがって、ControlTemplate 内で Command プロパティを設定する場合、テンプレート内のコントロールに対して直接指定されるため、期待通りに動作します。一方、親要素で Command プロパティを直接指定した場合、テンプレート内のコントロールのプロパティには影響を与えず、その親要素のプロパティが優先されます。
>
>このように、ControlTemplate 内でのプロパティの設定は、テンプレートが適用されたコントロールに対して直接的な影響を与えることができます。そのため、テンプレート内でコマンドのバインディングを設定することで、期待通りの動作が実現できたのです。