다음을 통해 공유


실습 정보: 데이터 형식 변환

값 변환기를 사용하면 데이터의 형식을 간편하게 변환할 수 있습니다. Blend for Visual Studio에 있는 개체의 속성 값을 데이터 값이나 다른 속성 값에 바인딩할 때는 값 형식이 일치해야 합니다. 예를 들어 "123"과 같은 텍스트 상자 문자열을 슬라이더 막대의 해당 정수 값으로 변환하거나 Visibility.Hidden과 같은 속성을 false와 같은 부울 값으로 변환할 수 있습니다.

값 변환기는 Microsoft .NET Framework 클래스의 코드로 IValueConverter 인터페이스를 구현합니다. 데이터 바인딩 엔진에서는 바인딩 원본과 바인딩 대상 간에 값을 이동할 때 Convert 및 ConvertBack 메서드를 호출하므로 두 메서드를 모두 구현해야 합니다. 자세한 내용은 MSDN에서 IValueConverter 인터페이스를 참조하십시오.

값 변환기를 적용하려면 속성에 데이터를 바인딩할 때 데이터 바인딩 만들기 대화 상자에서 값 변환기 필드를 입력하면 됩니다.

값 변환기 클래스 만들기

이 절차에서는 해당 코드 숨김 파일에 이미 C#를 사용하는 프로젝트에만 추가할 수 있는 C#로 작성된 .NET 클래스 예제를 제공합니다. 그러나 이 절차 외에도 다른 여러 가지 방법으로 프로젝트에 코드를 추가할 수 있습니다. Microsoft Visual Studio를 사용하여 클래스를 .dll로 컴파일한 다음 프로젝트에 .dll 파일에 대한 참조를 추가할 수도 있습니다.

자세한 내용은 Blend에서 참조 추가 또는 제거을 참조하십시오.

값 변환기 클래스 만들기

  1. 프로젝트 패널에서 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 새 항목 추가를 클릭합니다.

  2. 새 항목 대화 상자에서 클래스를 클릭하고 이름 필드에 DoubleValueConverter.cs를 입력한 다음 확인을 클릭합니다.

    솔루션에서 사용 중인 언어로 새 코드 파일이 만들어집니다. 이 절차에서는 C# 언어가 사용됩니다. 이 파일은 프로젝트에 추가되며 아트보드에서 열립니다.

  3. DoubleValueConverter.cs 파일에서 다음 클래스 정의를 삭제합니다.

    public class DoubleValueConverter
    {
        public DoubleValueConverter()
        {
            // Insert code required on object creation below this point.
        }
    }
    
  4. 삭제한 코드를 다음과 같은 두 개 값 변환기 클래스가 포함된 다음 코드로 바꿉니다.

    • DoubleToIntegerValueConverter  double 값과 정수 간의 양방향 변환을 제공합니다.

    • DoubleToRomanNumeralValueConverter double 값을 로마 숫자의 문자열 표현으로 변환하는 단방향 변환을 제공합니다.

        /// <summary>
        /// DoubleToIntegerValueConverter provides a two-way conversion between
        /// a double value and an integer.
        /// </summary>
        public class DoubleToIntegerValueConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter,
                  System.Globalization.CultureInfo culture)
            {
                return System.Convert.ToInt32(value);
            }
    
            public object ConvertBack(object value, Type targetType,
                object parameter, System.Globalization.CultureInfo culture)
            {
                return System.Convert.ToDouble(value);
            }
    
        }
    
        /// <summary>
        /// DoubleToRomanNumeralValueConverter provides a one-way conversion from
        /// a double value to a string representation of a Roman numeral.
        /// </summary>
        public class DoubleToRomanNumeralValueConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter,
                System.Globalization.CultureInfo culture)
            {
                return this.ConvertToRomanNumeral(System.Convert.ToInt32(value));
            }
    
            public object ConvertBack(object value, Type targetType,
                object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
    
            private List<IntegerStringPair> romanStrings = null;
    
            private string ConvertToRomanNumeral(int input)
            {
                StringBuilder myBuilder = new StringBuilder();
    
                foreach (IntegerStringPair thisPair in this.PairSet)
                {
                    while (input >= thisPair.Value)
                    {
                        myBuilder.Append(thisPair.StringValue);
                        input -= thisPair.Value;
                    }
                }
    
                return myBuilder.ToString();
            }
    
            private List<IntegerStringPair> PairSet
            {
                get
                {
                    if (this.romanStrings == null)
                    {
                        this.romanStrings = new List<IntegerStringPair>();
                        this.romanStrings.Add(new IntegerStringPair(1000, "M"));
                        this.romanStrings.Add(new IntegerStringPair(900, "CM"));
                        this.romanStrings.Add(new IntegerStringPair(500, "D"));
                        this.romanStrings.Add(new IntegerStringPair(400, "CD"));
                        this.romanStrings.Add(new IntegerStringPair(100, "C"));
                        this.romanStrings.Add(new IntegerStringPair(90, "XC"));
                        this.romanStrings.Add(new IntegerStringPair(50, "L"));
                        this.romanStrings.Add(new IntegerStringPair(40, "XL"));
                        this.romanStrings.Add(new IntegerStringPair(10, "X"));
                        this.romanStrings.Add(new IntegerStringPair(9, "IX"));
                        this.romanStrings.Add(new IntegerStringPair(5, "V"));
                        this.romanStrings.Add(new IntegerStringPair(4, "IV"));
                        this.romanStrings.Add(new IntegerStringPair(1, "I"));
                    }
    
                    return this.romanStrings;
                }
            }
        }
    
        /// <summary>
        /// IntegerStringPair provides an easy way to store integer and string pairs.
        /// </summary>
        public class IntegerStringPair
        {
            private int value;
            private string stringValue;
            public int Value
            {
                get
                {
                    return this.value;
                }
            }
            public string StringValue
            {
                get
                {
                    return this.stringValue;
                }
            }
            public IntegerStringPair(int value, string stringValue)
            {
                this.value = value;
                this.stringValue = stringValue;
            }
        }
    
  5. Ctrl+Shift+B를 눌러 솔루션을 빌드하고 오류가 있는지 확인합니다.

    솔루션을 빌드하면 코드 파일이 컴파일되고 Blend가 데이터 바인딩 만들기 대화 상자 등에서 클래스를 사용할 수 있게 됩니다.코드 파일에 새 클래스를 추가하는 경우에는 Blend에서 클래스를 사용할 수 있도록 솔루션을 다시 빌드해야 합니다.

속성에 값 변환기 적용

다음 절차에서는 두 TextBox 개체에 값을 바인딩할 때 이전 절차의 값 변환기를 Slider 개체의 값에 적용하여 텍스트 상자에 Slider 값의 정수 및 로마 숫자 표현이 표시되도록 합니다.

속성에 값 변환기 적용

  1. 도구 패널에서 아래쪽 도구 그룹을 마우스 오른쪽으로 클릭한 다음, 나타나는 목록에서 Slider 컨트롤 JJ170529.b478d0b9-7525-47cb-b633-0007e08432d4(ko-kr,VS.120).png을 선택합니다.

  2. Slider 컨트롤을 주 문서의 아트보드로 끌어 놓습니다.

  3. 새 Slider 개체를 선택하고 속성 패널의 공용 속성에서 다음 속성을 찾아 해당 값을 다음과 같이 설정합니다.

    • LargeChange을 10으로 설정합니다. 이 값은 슬라이더 막대를 클릭할 때 변경되는 크기입니다.

    • Maximum을 2001으로 설정합니다. 슬라이더를 0에서 2001로 이동시킵니다.

    • SmallChange을 1로 설정합니다. 이 값은 화살표 키를 사용하여 슬라이더를 이동할 때 변경되는 크기입니다.

  4. 도구 패널에서 아래쪽으로부터 두 번째인 도구 그룹을 마우스 오른쪽 클릭한 다음, 나타나는 목록에서 TextBox JJ170529.b5206bf1-18c8-491f-8239-3e542b2ca147(ko-kr,VS.120).png 컨트롤을 선택합니다.

  5. 아트보드에서 슬라이더 개체 옆에 텍스트 상자 컨트롤을 두 개 그립니다.

  6. 첫 번째 텍스트 상자 개체를 선택한 다음 속성 패널의 공용 속성 아래에서 Text 속성을 찾습니다. 이 Text 속성을 슬라이더 값에 바인딩합니다.

  7. 고급 옵션 JJ170529.12e06962-5d8a-480d-a837-e06b84c545bb(ko-kr,VS.120).png을 클릭하고, 나타나는 목록에서 데이터 바인딩을 클릭합니다.

  8. 데이터 바인딩 만들기 대화 상자에서 요소 속성 탭을 클릭합니다. 이 탭에서 내부 값을 속성에 바인딩합니다.

  9. 장면 요소 아래에서 요소 트리를 확장하고 [Slider] 개체를 선택합니다.

  10. 속성에서 **Value : (Double)**을 선택합니다.

    그러면 텍스트 상자의 콘텐츠가 슬라이더의 값에 바인딩됩니다.

  11. 고급 속성 표시 JJ170529.de239c9d-42ce-4f5e-83b9-5f9924c0431f(ko-kr,VS.120).png를 클릭하고 값 변환기 옆에 있는 새 값 변환기 추가JJ170529.3f9fe48b-caf8-4989-8a91-017ba1e0cb77(ko-kr,VS.120).png를 클릭합니다.

  12. 값 변환기 추가 대화 상자에서 DoubleToIntegerValueConverter를 선택한 다음 확인을 클릭합니다.

    값 변환기가 표시되지 않으면 이전 절차에서 만든 원본 파일(DoubleValueConverter.cs)을 프로젝트에 추가하고, 프로젝트를 빌드했는지(Ctrl+Shift+B) 확인합니다.

  13. 데이터 바인딩 만들기 대화 상자에서 확인을 클릭합니다.

    이제 첫 번째 Label 개체에 슬라이더의 정수 표현이 표시됩니다.

    참고

    슬라이더 개체에 slider라는 이름을 지정했습니다.데이터 바인딩처럼 응용 프로그램의 다른 위치에서 개체를 참조하려면 응용 프로그램의 개체에 이름을 지정해야 합니다.Blend는 사용자 이름을 만듭니다.

  14. 두 번째 텍스트 상자에 대해 6단계부터 13단계를 반복합니다. 단, 값 변환기 추가 대화 상자에서는 DoubleToRomanNumeralValueConverter를 선택합니다.

  15. 프로젝트를 실행합니다(F5 키). 슬라이더를 이동하여 두 레이블에서 값이 업데이트되는지 확인합니다.

    JJ170529.f1241b72-d14a-4de2-9d99-332418f84561(ko-kr,VS.120).png

    값 변환기를 사용하지 않으면 슬라이더 값이 표시되는 텍스트 상자에 많은 소수 자릿수가 표시됩니다.

    JJ170529.0279e814-a5af-4322-84d4-754083a57f83(ko-kr,VS.120).png

참고 항목

작업

개체를 사용자 입력 값 또는 기타 내부 값에 바인딩

개념

데이터를 표시하는 컨트롤의 스타일 지정

데이터 표시