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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

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

Q&A

解決済

1回答

4107閲覧

WPF XAML側のみでユーザーコントロールに異なる値をバインドしたい

Praline

総合スコア46

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

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

0グッド

0クリップ

投稿2017/02/04 12:02

編集2017/02/05 03:24

###前提・実現したいこと
作成したユーザーコントロールに、XAML側のみで異なる値をバインドしたい。
動的に内容が変わらない共通するインターフェースのため、コードは使わず値のみのバインドしたほうがメンテもわかりやすいと思っております。

またオマケですが、複数のユーザーコントロールを作成する場合、ネーミングやメインウィンドウ側でどのように違うユーザーコントロールを指定するのか、その方法も教えていただけると幸いです。

###想定している設計

XML

1<!--ユーザーコントロール--> 2 3<UserControl x:Class="UserControl1" 4 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 5 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 8 xmlns:local="clr-namespace:WPF_practice" 9 mc:Ignorable="d" 10 d:DesignHeight="20" d:DesignWidth="50"> 11 <Grid> 12 13 <!--2つのコントロールを区別する方法--> 14 <StackPanel Orientation="Vertical"> 15 <TextBlock Height="20" TextAlignment="Center" FontSize="10" Text="{Binding}"/> 16 <!--Textの部分にバインドする--> 17 </StackPanel> 18 19 <StackPanel Orientation="Vertical"> 20 <TextBlock Height="10" TextAlignment="Center" FontSize="10" Text="{Binding}"/> 21 <!--Textの部分にバインドする--> 22 </StackPanel> 23 24 </Grid> 25</UserControl>

XML

1<!--メインウィンドウ--> 2<Window x:Class="MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 7 xmlns:local="clr-namespace:WPF_practice" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="350" Width="525"> 10 11 <Grid> 12 <local:UserControl1 Text="Control1_A"/> 13 <local:UserControl1 Text="Control1_B"/> 14 <local:UserControl1 Text="Control2_A"/> 15 <local:UserControl1 Text="Control1_C"/> 16 <!--上記のように、コードは使わずバインドしたい--> 17 </Grid> 18</Window> 19

###想定しているビュー
イメージ説明

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

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

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

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

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

Tak1wa

2017/02/04 12:27

前者は何をやりたいのかがよくわかりませんので、何かやりたいことを補足できないでしょうか。後者はx:Name使えば済む話ではないですかね。
Praline

2017/02/04 12:57 編集

前者ですが、上記だと「Control1」「Control2」と表記された、 ユーザーコントロールで指定したテキストブロックを並べて表示したいです。 後者についてもありがとうございます。 ユーザーコントロール側でx:Nameとした場合、メインウィンドウ側ではどのような指定が正しいでしょうか? 勉強し始めなもので、申し訳ないです…
Tak1wa

2017/02/04 13:00

あーなるほど、意味がわかったかもです。しょうしょうおまちを。
guest

回答1

0

ベストアンサー

こんにちは。

Textに色々な役割を持たせすぎてしまいますのでこれは好ましくありません。
UserControl自体を別で作成するか、レイアウトを切り替えるプロパティを別途用意しましょう。

XML

1<Window x:Class="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:VisualBasic.Wpf.Samples" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="300" Width="300"> 9 <StackPanel Orientation="Horizontal"> 10 <local:UserControl1 Text="Control1_A" LayoutType="Control1" /> 11 <local:UserControl1 Text="Control1_B" LayoutType="Control1" /> 12 <local:UserControl1 Text="Control2_A" LayoutType="Control2" /> 13 <local:UserControl1 Text="Control1_C" LayoutType="Control1" /> 14 </StackPanel> 15</Window>

XML

1<UserControl x:Class="UserControl1" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 mc:Ignorable="d" 7 x:Name="uc" 8 d:DesignHeight="20" d:DesignWidth="50"> 9 <Grid> 10 <ContentControl VerticalAlignment="Top" Width="100" Margin="10" VerticalContentAlignment="Center"> 11 <ContentControl.Style> 12 <Style TargetType="ContentControl"> 13 <Style.Triggers> 14 <!--2つのコントロールを区別する方法 → LayouType依存関係プロパティで切り替える例--> 15 <DataTrigger Binding="{Binding LayoutType, ElementName=uc}" Value="Control1"> 16 <Setter Property="Template"> 17 <Setter.Value> 18 <ControlTemplate> 19 <Border Background="#FF00A0E9" Height="40"> 20 <TextBlock VerticalAlignment="Center" TextAlignment="Center" 21 Text="{Binding Text, ElementName=uc}"/> 22 </Border> 23 </ControlTemplate> 24 </Setter.Value> 25 </Setter> 26 </DataTrigger> 27 <DataTrigger Binding="{Binding LayoutType, ElementName=uc}" Value="Control2"> 28 <Setter Property="Template"> 29 <Setter.Value> 30 <ControlTemplate> 31 <Border Background="#FFEE7642" Height="20"> 32 <TextBlock VerticalAlignment="Center" 33 TextAlignment="Center" 34 Text="{Binding Text, ElementName=uc}"/> 35 </Border> 36 </ControlTemplate> 37 </Setter.Value> 38 </Setter> 39 </DataTrigger> 40 </Style.Triggers> 41 </Style> 42 </ContentControl.Style> 43 </ContentControl> 44 </Grid> 45</UserControl>

VB

1Public Class UserControl1 2 Public Property Text() As String 3 Get 4 Return CType(Me.GetValue(TextProperty), String) 5 End Get 6 Set(ByVal value As String) 7 Me.SetValue(TextProperty, value) 8 End Set 9 End Property 10 Public Shared ReadOnly TextProperty As DependencyProperty = DependencyProperty.Register("Text", GetType(String), GetType(UserControl1), New PropertyMetadata(String.Empty)) 11 12 Public Property LayoutType() As String 13 Get 14 Return CType(Me.GetValue(LayoutTypeProperty), String) 15 End Get 16 Set(ByVal value As String) 17 Me.SetValue(LayoutTypeProperty, value) 18 End Set 19 End Property 20 Public Shared ReadOnly LayoutTypeProperty As DependencyProperty = DependencyProperty.Register("LayoutType", GetType(String), GetType(UserControl1), New PropertyMetadata(String.Empty)) 21 22End Class

投稿2017/02/04 13:09

編集2017/02/05 04:27
Tak1wa

総合スコア4791

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

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

Praline

2017/02/04 14:34

失礼しました、x:Name="uc"の部分が漏れておりました… すみません自分の説明が足りていなかったのですが、ユーザーコントロールのTextBlockを含むStackPanelはそれぞれ独立した別のもの、と考えていました。 Control1はHeight10、Control2はHeight20、のTextBlockとして表示をしたかったです。
Tak1wa

2017/02/04 20:50

ちょっとまだやりたいことがわからないです。 図示できないでしょうか。
Praline

2017/02/05 03:25

失礼しました、画像を追加させていただきました。こちらで汲み取っていただけると助かります…
Tak1wa

2017/02/05 03:29

なるほど。DataContext使ったほうが楽なのですが、OKでしょうかね
Praline

2017/02/05 03:32 編集

はい、問題ございません。 依存関係諸々の理解が少し追いついていなかったのですが、後学のためにも勉強させていただきたいと思います。
Tak1wa

2017/02/05 04:28

なおしました。 タイトルに気づいたので結局DataContextは使わない方向にしました。
Praline

2017/02/06 13:45

すみません、タイトルまで汲み取っていただきありがとうございます。自分の希望する方法そのままで再現することができました。 やや理解が追いついていない部分があるので、こちら参考に勉強させていただきます。 ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問