2023. 6. 4. 00:07

DataTemplate을 이용하면 데이터를 유연하게 표시할 수 있다.

참고 url: c# - Binding ContentControl Content for dynamic content - Stack Overflow

 

예제

<UserControl x:Class="ColorViews.DarkTurquoise"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008
             xmlns:local="clr-namespace:ColorViews"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Border Background="DarkTurquoise" />
    </Grid>
</UserControl>

 

using DemoLibrary;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ColorViews
{
    public class DarkTurquoiseViewModel : ViewModelBase
    {

    }
}

 

위와 같은 사용자정의 컨트롤을 만들었다.

이것을 메인 윈도우나 다른 컨트롤에 연결하려고 할경우 MVVM을 해치게 될 경우가 있다.

이럴때 간단하게 Xaml로 DataTemplate에 등록한 후 메인 뷰모델에서 인스턴스만 생성해 놓으면(물론 Prism같은 것을 사용하면 더 간단하고 Unity 같은 DI 프레임워크를 사용할 수 있지만, 없다고 가정한다.

 

<Window x:Class="PlainWpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PlainWpfApp"
        xmlns:color="clr-namespace:ColorViews;assembly=ColorViews"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <DataTemplate DataType="{x:Type color:DarkTurquoiseViewModel}">
            <color:DarkTurquoise />
        </DataTemplate>
    </Window.Resources>
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <!--<StackPanel>
            <TextBlock Text="Test1" />
        </StackPanel>-->
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.2*"/>
                <ColumnDefinition Width="0.8*"/>
            </Grid.ColumnDefinitions>
            <ContentControl Grid.Column="0" Content="{Binding DarkTurq}" />
        </Grid>
    </Grid>
</Window>

 

using ColorViews;
using DemoLibrary;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace PlainWpfApp
{
    public class MainWindowViewModel : ViewModelBase
    {
        private ViewModelBase _darkTurq;
        public ViewModelBase DarkTurq
        {
            get { return _darkTurq; }

            set
            {
                _darkTurq = value;
                this.NotifyPropertyChanged();
            }
        }


        public MainWindowViewModel()
        {
            DarkTurq = new DarkTurquoiseViewModel();   
        }



    }
}

'C#' 카테고리의 다른 글

Wpf MVVM  (0) 2023.06.03
링크 정리하기  (0) 2018.08.15
DB접속해서 테이블 데이터 참조하기  (0) 2016.12.29
C# ArrayList  (0) 2016.12.26
Posted by 다만사