2018년 1월 31일 수요일

[닷넷학원/WPF교육] 컨텐트 프로퍼티란?

(WPF기초강좌)컨텐트 프로퍼티란?_WPF실무학원/C#학원 

Content Property?

n  XAML의 엘리먼트는 서로 다른 콘텐츠 형식을 표시 할 수 있는데 엘리먼트의 기능에 따라 콘텐츠를 표시하는 데 사용되는 Content라는 특수한 속성(Property)을 제공한다.
n  Content 속성은 자식 요소를 담고있는 컨테이너 또는 부모 요소 일 수도 있다아래 코드는 Button의 내용으로 5 개의 자식 요소가있는 StackPanel 컨테이너를 설정한다.
<Button Margin="10,201,100,40"> 
<StackPanel Orientation="Horizontal"> 
<Ellipse Height="60" Width="60" Fill="Red"/> 
<TextBlock TextAlignment="Center"><Run Text=" Red Circle"/> 
<TextBlock TextAlignment="Center"><Run Text=" "/></TextBlock> 
<Rectangle Height="60" Width="120" Fill="Green"></Rectangle> 
<TextBlock TextAlignment="Center"><Run Text=" Green Rectangle"/> 
</StackPanel> 
</Button>

 n  모든 요소가 컨텐츠(Contents)로 사용될 수 있지만 모두 Content 속성을 가지고 있는 것은 아니다. ContentControl을 상속받은 요소(Window, Button, Label)만 Content 속성이 사용 가능하다.
n  Button Content 속성은 Object 타입으로 문자열객체, UIElement 또는 컨테이너로 설정할 수 있다.
n  일부 XAML 객체는 사용할 수있는 Content 속성이 없을 수 있으므로 속성을 통해 설정해야 한다.

<Button Height="50" Margin="10,10,300,300" Content="Hello XAML" />
<Button Height="50" Margin="10,10,350,310">Hello XAML</Button>

// 아래 TextBox의 Text 속성에 값을 입력하지 않고 태그 사이에 넣어도
// Text 속성으로 인식하는 것은 ContentProperry로 정의 되었기 때문이다.
// ContentProperty는 XAML 프로세서가 자식 엘리먼트를 프로세싱할때
// 사용하는 기본 속성정보이다.
<TextBox Name="TextBox1" Height="30" Width="200" Text="Hello~"/>
<TextBox Name="TextBox1" Height="30" Width="200" >
     Hello~
</TextBox>

[WPF실습예제] InotifyPropertyChanged 인테페이스를 이용한 데이터 바인딩 예제

(C#,WPF XAML 데이터바인딩)InotifyPropertyChanged 인테페이스를 이용한 데이터 바인딩 예제_WPF데이터바인딩교육/WPF출강학원 

INotifyPropertyChanged 인테페이스를 
이용한 데이터 바인딩 예제
n  INotifyPropertyChanged 인터페이스는 속성 값이 변경되면 클라이언트에 알리는 데 사용된다. INotifyPropertyChanged 인터페이스에는 PropertyChanged라는 이벤트가 포함되어 있는데 ViewModel / Model 개체의 속성이 변경되면 PropertyChanged 이벤트를 발생시켜 WPF 바인딩 시스템(VIEW, XAML)에 새 값을 알려준다.

n  INotifyTest 라는 이름으로 WPF 프로젝트 생성
n  Person.cs
using System.ComponentModel;
namespace INotifyTest{
    public class Person : INotifyPropertyChanged    {
        private string name;

        // Declare the event 
        public event PropertyChangedEventHandler PropertyChanged;

        public Person() { }

        public Person(string value) { this.name = value; }
        //아래 PersonName 속성 값이 변경되면
        public string PersonName
        {
            get { return name; }
            set
            {
                name = value;
                // Call OnPropertyChanged whenever the property is updated 
                OnPropertyChanged("PersonName");
            }
        }
        // Create the OnPropertyChanged method to raise the event 
        protected void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

n  MainWindow.xaml
<Window x:Class="INotifyTest.MainWindow"
        xmlns:local="clr-namespace:INotifyTest"
        xmlns:src="clr-namespace:INotifyTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <!--<SnippetBindingSource>-->
    <Window.Resources>
        <src:Person x:Key="myDataSource" PersonName="홍길동"/>
        <!--</SnippetInstantiation>-->
        <Style TargetType="{x:Type Label}">
            <Setter Property="DockPanel.Dock" Value="Top"/>
            <Setter Property="FontSize" Value="12"/>
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="25"/>
            <Setter Property="DockPanel.Dock" Value="Top"/>
        </Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="25"/>
            <Setter Property="DockPanel.Dock" Value="Top"/>
            <Setter Property="Padding" Value="3"/>
        </Style>
        <!--<Snippet2>-->
    </Window.Resources>
    <!--</Snippet2>-->
    <Border Margin="5" BorderBrush="Aqua" BorderThickness="1" Padding="8" CornerRadius="3">
        <DockPanel Width="200" Height="100" Margin="35">
            <!-- <Snippet1> -->
            <Label>Enter a Name:</Label>
            <TextBox>
                <TextBox.Text>
                    <Binding Source="{StaticResource myDataSource}" Path="PersonName" UpdateSourceTrigger="PropertyChanged"/>
                </TextBox.Text>
            </TextBox>
            <!-- </Snippet1> -->
            <!--</SnippetBindingSource>-->
            <Label>The name you entered:</Label>
            <!--<SnippetBDO1>-->
            <TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>
            <!--</SnippetBDO1>-->
        </DockPanel>
    </Border>
    <!--<SnippetEndWindow>-->
</Window>



[WPF추천강좌] 이벤트, 델리게이트를 통한 메인윈도우의 ListBox Refresh



(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListBox Refresh 적용 실습, WPF추천학원 from 탑크리에듀(구로디지털단지역3번출구 2분거리)
(WPF동영상)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트, 델리게이트를 통한 메인윈도우의 ListBox Refresh_WPF학원,WPF교육,WPF추천강좌 

ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListBox Refresh 적용 실습
직무타입(내근:Inner, 외근:OutSide)과 직무목록을 보여주는 두개의 ListBox 컨트롤을 사용해서 직무타입을 선택하면 Linq를 통해 해당 직무타입의 직무를 쿼리해서 하단의 ListBox에 보여주는 예제이다.


“직무추가” 버튼을 클릭하면 새창이 뜨고 직무를 입력 후 저장 버튼을 클릭하면 직무입력 화면이 사라지고 메인 윈도우 상단의 ListBox가 새창에서 입력한 직무타입으로 선택되면서 하단의  ListBox는 해당 직무타입의 직무목록으로 자동으로 Refresh 된다.