2008-10-24 2 views
2

데이터 바인딩을 사용하여 값 형식을 사용하는 새 개체를 어떻게 바인딩합니까?.Net 데이터 값 형식 속성이있는 새 개체 바인딩

간단한 예 :

public class Person() { 
    private string _firstName; 
    private DateTime _birthdate; 
    private int _favoriteNumber; 
    //Properties 
} 

나는 새로운 사람을() 생성하고 텍스트 상자 폼에 바인딩합니다. 생년월일은 01/01/0001, 즐겨 찾기 번호는 0으로 표시됩니다.이 필드는 필수 항목입니다. 그러나이 상자는 비어 있고 사용자가 채우도록하십시오.

이 솔루션은 또한 기본값을 설정할 수 있어야합니다. 전지. 이 예에서는 즐겨 찾기 번호가 42로 기본 설정되도록 할 수 있습니다.

Silverlight에 대해 특별히 묻지 만 WPF와 WinForms에 동일한 문제가 있다고 가정합니다.

편집 :

내가 그러나 우리가 현재 클라이언트와 서버에서 동일한 도메인 객체를 사용하고 nullable 형식의 생각 나는 필수 필드가 null이 아니하고 싶지 않아요. 데이터 바인딩 엔진이 새로운 객체를 바인딩하고 있음을 알 수있는 방법을 공개하기를 희망합니다.

답변

2

아마도 Nullable 유형을 사용해 볼 수 있습니까?

public class Person() { 
    private string? _firstName; 
    private DateTime? _birthdate; 
    private int? _favoriteNumber; 
    //Properties 
} 

또는 실제로 동일한

public class Person() { 
    private Nullable<string> _firstName; 
    private Nullable<DateTime> _birthdate; 
    private Nullable<int> _favoriteNumber; 
    //Properties 
} 

.

이제 기본값은 null이며 속성을 설정하여 속성을 값으로 설정할 수 있습니다. null 허용 유형에 대한

더 :

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

0

나는 당신은 당신의 텍스트 상자를 포맷 IValueConverter를 사용할 수 있습니다에 더 이런 식으로 뭔가를 보이는 사람 클래스 ...

public class Person 
    { 
    private int _favoriteNumber = 0; 
    public string FavoriteNumber 
    { 
     get 
     { 
     return _favoriteNumber > 0 ? _favoriteNumber.ToString() : string.Empty; 
     } 
     set 
     { 
     _favoriteNumber = Convert.ToInt32(value); 
     } 
    } 

    private DateTime _birthDate = DateTime.MinValue; 
    private string BirthDate 
    { 
     get 
     { 
     return _birthDate == DateTime.MinValue ? string.Empty : _birthDate.ToString(); //or _birthDate.ToShortDateString() etc etc 
     } 
     set 
     { 
     _birthDate = DateTime.Parse(value); 
     } 
    } 
    } 
0

를 다시 작성할 것 오브젝트의 값에 기초한 디폴트 값으로의 바인딩. 다음은 불행하게도이 이러한 속성 각각에 대한 null 허용 값의 옵션을 가지고 있지 않기 때문에 당신이 필요하지 않을 수도를 IValueConverter

http://ascendedguard.com/2007/08/data-binding-with-value-converters.html http://weblogs.asp.net/marianor/archive/2007/09/18/using-ivalueconverter-to-format-binding-values-in-wpf.aspx

에 대한 몇 가지 링크입니다.

데이터 바인딩을 수행 할 때 개체의 기본 속성을 설정하면됩니다.

기본값으로 Person.Empty 개체를 사용하면이 작업을 수행 할 수 있습니다. 또는 DataContext가 설정 될 때이 값을 명시 적으로 설정하십시오. :)

1

가 값 변환기를 사용하려고하지만

어느 쪽이든 작동합니다, 여기에서 시작한다 예입니다.

기본 아이디어는 데이터가 표시 될 때 유형의 기본값을 널 (null)로 변환하고 바인딩 소스가 갱신 될 때 널 (Null) 값을 유형 기본값으로 다시 변환하는 것입니다. 당신이 장소에 계산기를 한 후

public class DefaultValueToNullConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     object result = value; 
     Type valueType = parameter as Type; 

     if (value != null && valueType != null && value.Equals(defautValue(valueType))) 
     { 
      result = null; 
     } 

     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     object result = value; 
     Type valueType = parameter as Type; 

     if (value == null && valueType != null) 
     { 
      result = defautValue(valueType); 
     } 
     return result; 
    } 

    private object defautValue(Type type) 
    { 
     object result = null; 
     if (type == typeof(int)) 
     { 
      result = 0; 
     } 
     else if (type == typeof(DateTime)) 
     { 
      result = DateTime.MinValue; 
     } 
     return result; 
    } 
} 

는 그런 다음 XAML에서 당신은 또한 Person 객체에에서 INotifyPropertyChanged를 impliment 할 필요가,이

<Page.Resources> 
    <local:DefaultValueToNullConverter x:Key="DefaultValueToNullConverter"/> 
</Page.Resources> 

<TextBox 
    Text="{Binding 
      Path=BirthDate, 
      Converter={StaticResource DefaultValueToNullConverter}, 
      ConverterParameter={x:Type sys:DateTime}}" 
    /> 
0

같은 컨버터를 참조합니다. 그런 식으로 바인딩의 Mode = TwoWay 양방향 데이터 바인딩을 설정하면 텍스트 상자에서 변경이 이루어지고 vis를 방문 할 때 객체의 값이 업데이트됩니다.

관련 문제