일단 NavigationService 을 이용해서 데이터 넘기는법부터 ㄱㄱ

image

데이터를 주고 받는데 사용되는 Person

namespace TestWpfBrowserApplication
{
    public  class Person
    {
        private string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        private string _Age;

        public string Age
        {
            get { return _Age; }
            set { _Age = value; }
        }
    }
}

 

NavigationService으로 페이지 이동

Page1.xaml 에서 “회원정보입력으로 이동”을 누르면 Page2.xaml로 이동한다.

image

image

page2에서 받은값을 돌려주고 있다.

image

image

 

 

Page1.xaml

namespace TestWpfBrowserApplication
{
    /// <summary>
    /// Page1.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }
        public Page1(Person p) : this()
        {
            this.label1.Content = p.Name;
            label2.Content = p.Age;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {

            //PageFunction1 page = new PageFunction1();            
            //page.Return += new ReturnEventHandler<Person>(page_Return);            

            Page2 p2 = new Page2();
            this.NavigationService.Navigate(p2);
        }

        void page_Return(object sender, ReturnEventArgs<Person> e)
        {
            //결과값을 뿌려주고 있다.
            //Person person = e.Result as Person;
            //this.label1.Content = person.Name;
            //label2.Content = person.Age;

        }
    }
}

Page2.xaml

namespace TestWpfBrowserApplication
{
    /// <summary>
    /// Page2.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class Page2 : Page
    {
        public Page2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Person person = new Person() { Age = this.txtAge.Text, Name = this.txtName.Text };
            Page1 p1 = new Page1(person);
            this.NavigationService.Navigate(p1);
        }
    }
}

 

 

전반적으로 NavigationService를 이용해서 간단히 페이지를 이동할 수 있다

private void button1_Click(object sender, RoutedEventArgs e)
{
   this.NavigationService.Navigate(new Page2());
}

 

 

 

 

하지만 위와 같은 방법은 매번 페이지를 생성하기 때문에 데이터관리가 까다롭다

그래서 데이터관리를 하면서 이동 할 수 있는 PageFunction 를 이용한다.

 

 

 

 

image

 

회원정보를 입력으로 이동 클릭하면 PageFunction1.xaml 로 이동한다

image 

입력완료를 누르면 다시 Page1.xaml 으로 돌아간다 이때 Person 데이터를 가지고 돌아간다

image

받아온 결과값을 뿌려주고 있다

image

 

Page1.xaml

namespace TestWpfBrowserApplication
{
    /// <summary>
    /// Page1.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
        
            PageFunction1 page = new PageFunction1();            
            page.Return += new ReturnEventHandler<Person>(page_Return);            
            this.NavigationService.Navigate(page);



        }

        void page_Return(object sender, ReturnEventArgs<Person> e)
        {
            //결과값을 뿌려주고 있다.
           Person person = e.Result as Person;
           this.label1.Content = person.Name;
           label2.Content = person.Age;

        }
    }
}

PageFunction1.xaml

Person 형식이므로
image 
TypeArguments를 맞춰준다.
image 


namespace TestWpfBrowserApplication
{
    /// <summary>
    /// PageFunction1.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class PageFunction1 : PageFunction<Person>
    {
        public PageFunction1()
        {
            InitializeComponent();                     
        }


        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Person person = new Person() {  Age=this.txtAge.Text , Name = this.txtName.Text };

            ReturnEventArgs<Person> returnObject = new ReturnEventArgs<Person>(person);
            OnReturn(returnObject);
        }

    
    }

}

 

로그인같은 단발성 UI 는 걍 NavigationService을 이용해서 처리하고

처리하고 회원가입같은 정보를 받아와야하는 경우에 PageFunction을 사용하면 좋겠다

 

물론

this.NavigationService.Navigate(new Page1(Person)); // 이렇게 해도 뭐…. ㅋ

 

참고 URL

http://msdn.microsoft.com/ko-kr/library/ms741843(v=VS.100).aspx

캔바스 크기에 따라서 캔바스 안에 컨트롤을 중앙에 위치하도록 해보자

image

실행된 모습

image

image

image

 

 

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:Com.Mariner.ERP.TestWPF" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="Com.Mariner.ERP.TestWPF.MainWindow"
        Title="MainWindow" Height="405" Width="669" Loaded="Window_Loaded">

    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="40.003"/>
        </Grid.RowDefinitions>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                <GradientStop Color="#FF373737" Offset="1"/>
                
                <GradientStop Color="#FF878787"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Canvas ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" d:LayoutOverrides="Width" Name="CanvasMain">
            <Canvas.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FFCACACA" Offset="0"/>
                    <GradientStop Color="#FF6A6A6A" Offset="1"/>
                </LinearGradientBrush>
            </Canvas.Background>
            <Rectangle Fill="#FFF4F4F5" Height="137" Canvas.Left="8" Stroke="Black" Width="266" Canvas.Top="6" Name="recItem" />
        </Canvas>
        <Button Content="check Size" HorizontalAlignment="Right" Margin="0,7.997,8,4.003" Width="123" Click="Button_Click" Grid.Row="1" />
        <TextBox Height="28" HorizontalAlignment="Left" Margin="8,8,0,0" Name="textBox1" VerticalAlignment="Top" Width="492" Grid.Row="1" />
    </Grid>
</Window>

CanvasMain.RenderSize //캔버스의 렌더링된 사이즈를 가져올수 있다.

비하인드 코드

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            SetSize(this.CanvasMain.RenderSize); //버튼클릭했을때 값을 확인해보자
        }

        private void SetSize(Size size)
        {
            double winl = (size.Width - this.recItem.ActualWidth) / 2; //가로크기에서 캔바스안에 아이템 넓이를 뺐따
            double wint = (size.Height - this.recItem.ActualHeight) / 2;//가로크기에서 캔바스안에 아이템 높이를 뺐따
            // Set new position of object.
            recItem.SetValue(Canvas.TopProperty, wint);
            recItem.SetValue(Canvas.LeftProperty, winl);

            this.textBox1.Text = string.Format("Width: {0} Height: {1}", size.Width, size.Height);
          
           
        }

 

참고URL

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=KO-KR&k=k(SYSTEM.WINDOWS.EVENTSETTER);k(VS.XAMLEDITOR);k(SOLUTIONITEMSPROJECT);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22)&rd=true

 

EventSetter (한번쯤 읽어보고 넘어가자~)

이벤트 setter는 라우트된 이벤트에 대한 응답으로 지정된 이벤트 처리기를 호출하며, 이러한 처리기는 Style을 참조하는 모든 요소에 적용되므로 각각의 개별 요소에 대해 인스턴스 처리기를 연결하지 않아도 됩니다.Style.Setters만이 EventSetter 개체를 지원합니다.

라우트된 이벤트에 대해서만 이벤트 setter를 선언할 수 있습니다.직접 라우팅 전략, bubbling 이벤트 또는 tunneling 이벤트를 사용하여 라우트된 이벤트에 대해 이벤트 setter를 선언할 수 있습니다.

EventSetter 클래스의 인스턴스는 대개 XAML(Extensible Application Markup Language)를 통해, 즉 XAML를 통해 정의되는 스타일 내의 개체 요소로 만들어집니다.EventSetter도 코드에서 인스턴스화할 수 있습니다.

이벤트 setter는 테마 리소스 사전에 포함된 스타일에는 사용할 수 없습니다.이는 테마 리소스 사전이 대개 런타임에 느슨한 BAML(이진 XAML) 파일인데다 처리기를 정의하는 관련 코드 숨김이 있을 수 있는 범위가 정의되어 있지 않기 때문입니다.

이벤트 setter를 통해 연결하는 처리기는 이벤트에 대한 클래스 처리기 및 인스턴스 처리기 이후에 호출됩니다.그러므로 클래스 처리기 또는 인스턴스 처리기가 해당 인수에서 이벤트를 처리한 것으로 표시하면 이벤트 setter가 구체적으로 HandledEventsToo true를 설정하지 않는 한 이벤트 setter가 선언하는 처리기는 호출되지 않습니다.

이벤트 setter는 BasedOn 스타일에서 생성될 수도 있습니다.스타일에서 생성되며 BasedOn으로 지정되는 이벤트 setter 처리기는 직접 적용되는 스타일에 대한 처리기 이후에 호출됩니다.

Style.Setters만이 EventSetter 개체를 지원합니다.트리거(TriggerBase 및 파생 클래스)는 EventSetter를 지원하지 않습니다.

 

UI

image 

.xaml

image

 

비하인드 코드

        void FileHyperlinkClick(object sender, RoutedEventArgs e)
        {
            //Hyperlink b = e.Source as Hyperlink;
            Hyperlink hy = sender as Hyperlink;
            //Contract.Data.PersonnelPerformanceReviewDetail 데이터 개체
            Contract.Data.PersonnelPerformanceReviewDetail ppd = this.datagrdPersonnelPerformanceReviewDetail.SelectedItem
                                                                                    as Contract.Data.PersonnelPerformanceReviewDetail;

            if (ppd != null)
            {
                // 특정파일 열기
            }

        }

WPF 프로젝트에 참조파일 추가

Microsoft.ReportViewer.Common,

Microsoft.ReportViewer.WinForms,

System.Windows.Forms,

WindowsFormIntegration.

 

 

windowsFormsHost를 끌어다 놓는다.

image

 

image

    <Grid >
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                <GradientStop Color="#FF373737" Offset="1"/>
                
                <GradientStop Color="#FF878787"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Canvas>
            <WindowsFormsHost Canvas.Left="0" Canvas.Top="31" Height="349" Name="windowsFormsHost1" Width="647" />
            <Label Canvas.Left="6" Canvas.Top="6" Content="WPF 리포트 생성" Height="28" Name="label1" />
        </Canvas>
    </Grid>

 

 

CS 코드

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            Microsoft.Reporting.WinForms.ReportViewer reportViewer = new Microsoft.Reporting.WinForms.ReportViewer();
            reportViewer.LocalReport.ReportPath = "Report1.rdlc";
            //리포트뷰 추가 데이터 엑세스 등등작업......
            this.windowsFormsHost1.Child = reportViewer;

            reportViewer.RefreshReport();
        }

 

기본적으로 텍스트박스의 스타일 아래와 같이 정의했다.

image

image

근데 특정 텍스트박스의 읽기를 못하게 초큼 간지나게 하고싶어서 스타일을 하나 만들었다.

image

image

근데 적용할땐 x:Key="IDTextBoxStyle" 키가 있으니깐 쉽게 적용되었는데

image

image

 

근데….

다시 원래의 전역으로 설정되는 스타일로  로 돌아갈려니 어케 돌아갸야 될지 난감 ㅡ_ㅡimage

찾다보니 방법이 아래와 같음

Style ts = Application.Current.FindResource(typeof(TextBox)) as Style;

 
        private void SetEnableMode(FrameworkElement fe, bool _Use)
        {
            Style UnEnableModeStyle = this.FindResource("IDTextBoxStyle") as Style; //사용안할때 스탈
            if (_Use)
            {             
                Style ts = Application.Current.FindResource(fe.GetType()) as Style; //기본  스탈로 돌아옴
                fe.Style = ts;      
              
            }
            else
            {                
                fe.Style = UnEnableModeStyle; //사용안함 설정                        
            }

            DependencyObjectType type = fe.DependencyObjectType;
            if (type.Name == "TextBox")
            {
               
                ((TextBox)fe).IsReadOnly = _Use ? false : true ;
            }

        }

FileDialog로 로컬파일 선택해서 표시하기

       private void selectBtn_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            
            // TODO: 사진선택.
           
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = "Images";
            dlg.DefaultExt = ".jpg"; 
            dlg.Filter = "JPEG |*.jpg| GIF |*.gif"; 
            
            Nullable<bool> result = dlg.ShowDialog();
           
            if (result == true)
            {

                string selectedFileName = dlg.FileName;                

                BitmapImage bitmap = new BitmapImage();

                bitmap.BeginInit();

                bitmap.UriSource = new Uri(selectedFileName);

                bitmap.EndInit();

                ImgUserImage.Source = bitmap;

                
            }
        }

선택한 파일 메모리스트림으로 저장하기

        private void selectBtn_Click(object sender, System.Windows.RoutedEventArgs e)
        {

            // TODO: 사진선택.

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = "Images";
            dlg.DefaultExt = ".jpg";
            dlg.Filter = "JPEG |*.jpg| GIF |*.gif";

            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {

                string selectedFileName = dlg.FileName;

                BitmapImage bitmap = new BitmapImage();
                bitmap.BeginInit();
                bitmap.UriSource = new Uri(selectedFileName);
                bitmap.EndInit();

                ImgUserImage.Source = bitmap;
                this.txtFileName.Text = selectedFileName;

                Int32 reads = 0;

                //임시 메모리스트림에 작성
                using (Stream st = dlg.OpenFile())
                {
                    using (MemoryStream output = new MemoryStream())
                    {
                        st.Position = 0;
                        Byte[] buffer = new Byte[256];

                        while (0 < (reads = st.Read(buffer, 0, buffer.Length)))
                        {
                            output.Write(buffer, 0, reads);
                        }
                        TempMemoryStream = output;
                        output.Flush();
                    } // in using
                } // out using
            }
        }

메모리스트림을 저장하기

pp.Personnel.Photo 은 System.Data.Linq.Binary 타입

        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_Photo", DbType = "Image", UpdateCheck = UpdateCheck.Never)]
        public System.Data.Linq.Binary Photo
        {
            get
            {
                return this._Photo;
            }
            set
            {
                if ((this._Photo != value))
                {
                    this.OnPhotoChanging(value);
                    this.SendPropertyChanging();
                    this._Photo = value;
                    this.SendPropertyChanged("Photo");
                    this.OnPhotoChanged();
                }
            }
        }

데이터베이스에 저장하기 위한 변수에 담기
pp.Personnel.Photo = new System.Data.Linq.Binary(TempMemoryStream.GetBuffer());

System.Data.Linq.Binary 형식을
WPF Image 컨트롤에 바인딩 시키기

 

        /// <summary>
        /// 외부에서 이미지 데이터가 변경되었습니다. 이미지 바인딩 처리;
        /// </summary>
        public void UpdatePersonImage()
        {
            Contract.Data.Insa.ParentPerson pp = this.MainContentGrid.DataContext as Contract.Data.Insa.ParentPerson;
            if (pp.Personnel.Photo.Length > 0)
            {
                System.Data.Linq.Binary binaryFile = pp.Personnel.Photo;                 
       
                using( System.IO.MemoryStream ms = new System.IO.MemoryStream( binaryFile.ToArray()))
                {

                    System.Drawing.Bitmap bm = new System.Drawing.Bitmap(ms);
                    this.imgPerson.Source = GetBitmapSource(bm);
                }

            }
        }
        private System.Windows.Media.Imaging.BitmapSource GetBitmapSource(System.Drawing.Bitmap _image)
        {
            System.Drawing.Bitmap bitmap = _image;
            System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                bitmap.GetHbitmap(),
                IntPtr.Zero,
                Int32Rect.Empty,
                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
            return bitmapSource;
        }

http://msdn.microsoft.com/ko-kr/library/ms752039.aspx

 

방법: 단순 바인딩 만들기

방법: 바인딩 소스 지정
방법: XAML의 바인딩에 사용할 수 있는 데이터 만들기
방법: TextBox 텍스트의 소스를 업데이트하는 시점 제어
방법: 바인딩 방향 지정
방법: 선택에 따라 수�� 및 표시 정보에 바인딩
방법: 열거형 바인딩
방법: 두 컨트롤의 속성 바인딩
방법: 바인딩 유효성 검사 구현
방법: 사용자 지정 개체의 유효성 검사 논리 구현
방법: 바인딩된 대상 속성에서 바인딩 개체 가져오기
방법: CompositeCollection 구현
방법: 바인딩된 데이터 변환
방법: 코드에서 바인딩 만들기
방법: 데이터 수집의 기본 뷰 가져오기
방법: 데이터 수집 뷰의 개체 탐색
방법: 뷰에서 데이터 필터링
How to: Sort Data in View
방법: XAML에서 뷰를 사용하여 데이터 정렬 및 그룹화
방법: 계층적 데이터에 마스터-세부 패턴 사용
방법: 계층적 XML 데이터에 마스터-세부 패턴 사용
방법: 바인딩된 항목 목록을 기반으로 값 산출
방법: 속성 변경 알림 구현
방법: ObservableCollection 만들기 및 바인딩
방법: PriorityBinding 구현
방법: XMLData Provider 및 XPath 쿼리를 사용하여 XML 데이터에 바인딩
방법: XDocument, XElement 또는 LINQ for XML 쿼리 결과에 바인딩
방법: XML 네임스페이스를 데이터 바인딩에 사용
방법: ADO.NET 데이터 소스 바인딩
방법: 메서드 바인딩
방법: 바인딩 업데이트 알림 설정
방법: 바인딩 지우기
방법: DataTemplate에서 생성된 요소 찾기
방법: 웹 서비스 바인딩
방법: LINQ 쿼리 결과에 바인딩

Element Property Binding 를 이용해서 데이터그리드 뷰의 정보를 받아와보자

아래의 화면은 데이터그리뷰드의 선택한 아이템의 정보를 하단 박스에 보여주고 있다.

image

XAML

<Window
        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:TestWPF"  xmlns:Microsoft_Windows_Controls_Ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna"  mc:Ignorable="d" x:Class="TestWPF.MainWindow"
        Title="MainWindow" Height="303" Width="564" Loaded="Window_Loaded">
    <Window.Resources>        
        <CollectionViewSource x:Key="customerViewSource" d:DesignSource="{d:DesignInstance local:Customer, CreateList=True}" />
    <DataTemplate x:Key="RowTemplate" >
    <Grid Width="105.31">
        <TextBox Margin="0,0,0,0.04" TextWrapping="Wrap" Text="{Binding Age}"/>
    </Grid>       
    </DataTemplate> 
    </Window.Resources>

    <Grid  x:Name="GridData" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="431"/>
            <ColumnDefinition Width="Auto" MinWidth="117"/>
        </Grid.ColumnDefinitions>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="White" Offset="0.004"/>
                <GradientStop Color="#FFA7A7A7" Offset="1"/>
                <GradientStop Color="#FFD4D4D4" Offset="0.176"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Grid VerticalAlignment="Top" Grid.ColumnSpan="2"/>
        <TextBox Height="24" Margin="0,0,131,8" TextWrapping="Wrap" VerticalAlignment="Bottom" Width="49" HorizontalAlignment="Right" DataContext="{Binding SelectedItem, ElementName=customerDataGrid}" Text="{Binding Age}"/>
            <TextBlock HorizontalAlignment="Left" Height="24" Margin="8,0,0,8" TextWrapping="Wrap" Text="Name:" VerticalAlignment="Bottom" Width="42"/>
            <TextBlock Height="24" Margin="0,0,181,8" TextWrapping="Wrap" Text="Age:" VerticalAlignment="Bottom" RenderTransformOrigin="0.962,0.5" HorizontalAlignment="Right" Width="26"/>
            <TextBox Height="24" Margin="50,0,0,8" TextWrapping="Wrap" VerticalAlignment="Bottom" Width="154" HorizontalAlignment="Left" DataContext="{Binding SelectedItem, ElementName=customerDataGrid}" Text="{Binding Path=Name, Mode=OneWay}"/>
        
        <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="200" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="12,12,0,0" Name="customerDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="400" >
            <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Name}" Header="Name" />
                    <DataGridTextColumn Binding="{Binding Age}" Header="Age" />                
            </DataGrid.Columns>
           
        </DataGrid>
    </Grid>
</Window>

데이터 그리드 데이터바인딩은 간단하게

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
           
            ObservableCollection<Customer> list = new ObservableCollection<Customer>();
            list.Add(new Customer { Age = 19, Name = "kojaedoo" });
            list.Add(new Customer { Age = 129, Name = "kojaedoo1" });
            list.Add(new Customer { Age = 49, Name = "kojaedoo2" });
            list.Add(new Customer { Age = 59, Name = "kojaedoo3" });
            list.Add(new Customer { Age = 69, Name = "kojaedoo4" });
            list.Add(new Customer { Age = 89, Name = "kojaedoo5" });                   
            this.GridData.DataContext = list;
            
        }

데이터그리드에 바인딩이 잘되는지 확인한판하고

아래의 두개 텍스트박스에 바인딩 시켜주자

image

텍스트 박스선택

image

DataContext 에 Element Property Binding 선택

image

선택하면 특정프로퍼티 선택하라고 마우스가 변경된다

이떄 특정 찍어주면된다 (상단의 customerDataGrid 찍어주면된다).

image

선택한 행의 정보를 받아올꺼니깐 SelectedItem 선택

 image

아래처럼 바뀐다

image

이제 선택한 아이템중에 특정데이터를 Text박스에 표시해주어야하니깐 바인딩네임을 지정해주자

아래처럼 Data Binding 선택

image

image

[Age]를 주었다.

XAML TextBox

<TextBox Height="24" Margin="50,0,0,8" TextWrapping="Wrap" VerticalAlignment="Bottom" Width="154" HorizontalAlignment="Left" DataContext="{Binding SelectedItem, ElementName=customerDataGrid}" Text="{Binding Age}"/>

텍스트박스는

image

이렇게 변경되어져 있다 Name도 위와같이 똑같이 진행

그럼 끗

http://msdn.microsoft.com/ko-kr/magazine/cc163299.aspx

 

image

Mode 특성은 원본과 대상 간의 데이터 흐름 방식을 결정하는 바인딩 모드를 정의합니다. 이러한 바인딩 모드로는 OneWay 외에 OneTime, OneWayToSource, TwoWay의 세 가지가 더 있습니다.

OneWay 바인딩

을 사용하면 원본을 변경할 때마다 원본에서 대상으로 데이터 흐름이 발생합니다. 예에서는 이 바인딩 모드를 명시적으로 지정했지만 OneWay 바인딩은 TextBlock의 Text 속성에 대한 기본 바인딩 모드이므로 지정하지 않아도 됩니다.

OneTime 바인딩

도 원본에서 대상으로 데이터를 보낸다는 점은 OneWay 바인딩과 같지만 응용 프로그램이 시작되거나 DataContext가 변경될 때만 이러한 데이터 흐름이 발생한다는 차이가 있습니다. 따라서 원본의 변경 알림을 수신하지 않습니다. OneWay 바인딩이나 OneTime 바인딩과는 달리 OneWayToSource 바인딩은 대상에서 원본으로 데이터를 보냅니다. 마지막으로,

TwoWay바인딩

원본 데이터를 대상으로 보내고 대상 속성의 값이 변경된 경우 변경 내용을 다시 원본으로 보냅니다

 

다운로드 경로 :http://smf.codeplex.com/

주요기능

It has a lot of features built-in to the framework such as:

  • Logging
  • DVR-style features
  • Fast forward
  • Slow motion
  • Media Markers
  • etc

+ Recent posts