40191


◆VIEWダイアログ

[code]

    UserControl.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="TemplateA">
                <local:TemplateAView Grid.Row="4" Grid.Column="1"/>
            </DataTemplate>
            <DataTemplate x:Key="TemplateB">
                <local:TemplateBView Grid.Row="4" Grid.Column="1"/>
            </DataTemplate>
            <local:TemplateSelector
            x:Key="MyTemplateSelector" 
            TemplateA="{StaticResource TemplateA}"
            TemplateB="{StaticResource TemplateB}"/>
        </ResourceDictionary>
    </UserControl.Resources>
    
    
        ～～
    
        ComboBoxやTextBoxなどの入力部品
    
        <ContentControl x:Name="templateSelector"
            Content="{Binding TemplateIndex}"
            ContentTemplateSelector="{StaticResource MyTemplateSelector}"/>
    
       ～～
        <Button Content="OK"
            Command="{Binding OKComamnd}"/>★①
    
[/code]

◆VIEW TemplateA  
ComboBoxやTextBoxなどの入力部品を配置  
◆VIEW TemplateB  
ComboBoxやTextBoxなどの入力部品を配置

◆VIEWMODEL TemplateA  
VIEWにバインドするプロパティなどを宣言  
◆VIEWMODEL TemplateB  
VIEWにバインドするプロパティなどを宣言

◆VIEWMODEL

public DelegateCommand OKComamnd { get; set; }

コンストラクタ内でOKボタン押下時処理を追加

[code]

           this.OKComamnd = new DelegateCommand(() =>
            {
                try
                {
                    入力値を保存してダイアログを閉じる★②
                }
                catch (Exception ex)
                {
                    Excep = ex;
                }
    
            });
    
[/code]

◆テンプレートのセレクタークラス  
public DataTemplate TemplateA { get; set; }  
public DataTemplate TemplateB { get; set; }

[code]

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            int value = (int)item;
            if (value == 0)
                return TemplateA;
            else if (value == 1)
                return TemplateB;
            return base.SelectTemplate(item, container);
    
        }
    
[/code]

コンボボックスなどの変更により、画面でTemplateA、TemplateBを切り替わるようになったのですが、  
★①のOKボタンを押下した場合に、TemplateA、TemplateBの選択した値を保存したいと考えているのですが、  
★②などで選択したTemplateAまたは、TemplateBの値を取得するにはどのような方法があるのでしょうか？


CC BY-SA 3.0
2017-12-11T08:55:12.060
40188
2017-12-12T10:58:09.853
2017-12-12T01:38:19.790
12842
12842
question
c#
C#にてDataTemplateのデータを取得したい


`templateSelector`という`ContentControl`の`Content`が`TemplateIndex`プロパティにバインドされており、`local:TemplateSelector`で`Content`の値によって`DataTemplate`を切り替えているということですよね？

でしたら`TemplateIndex`プロパティがビューモデル側に存在していると思いますので、単に

[code]

    var value = this.TemplateSelector;
    
[/code]

のようにアクセスできると思います。

* * *

なお`ContentControl.Content`に`int`を渡してしまうと`DataTemplate`の内部で意味のある処理をすることが難しくなります。`TemplateIndex`のかわりに適当なビューモデルを使用して

[code]

    class HogeContentViewModel
    {
        private readonly ParentViewModel _Parent;
        public HogeContentViewModel(ParentViewModel parent)
        {
            _Parent = parent;
        }
    }
    
    class FugaContentViewModel { }
    
    class ParentViewModel 
    {
        // 実際には変更通知を行う
        public object TemplateContent { get; set; } 
    }
    
[/code]

のように定義し、`TemplateContent`をバインドして

[code]

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is HogeContentViewModel)
            return TemplateA;
        else if (item is FugaContentViewModel)
            return TemplateB;
        return base.SelectTemplate(item, container);
    }
    
[/code]

のように実装すれば`ContentControl`内部で`DataContext`として各`ContentViewModel`が使用できますので、これを経由して`DataTemplate`とビューモデル層が相互作用できます。


CC BY-SA 3.0
2017-12-11T11:02:32.763
40191
2017-12-12T10:58:09.853
2017-12-12T10:58:09.853
5750
5750
40188
answer