wp7 데이터 귀속

25489 단어 데이터 바인딩
Silverlight의 데이터 귀속은 귀속된 대상에 특별한 요구가 있습니다. 만약에 일반적인 get, set 속성의 대상만 데이터 귀속에 사용하면 문제가 많습니다(양방향으로 귀속할 수 없습니다). 일반적인 요구 클래스는 INotify Property Changed 인터페이스를 실현하거나 Dependency Object에서 계승하는 방법입니다. 지금은 Dependency Object를 사용하는 방법을 추천합니다.
 
 
첫 번째 바인딩 방법: INotifyPropertyChanged 인터페이스 구현
 1 public class Person:INotifyPropertyChanged

 2     {

 3        public event PropertyChangedEventHandler PropertyChanged;

 4 

 5        private string name;

 6       public string Name

 7       {

 8          get

 9            {

10                return name;

11            }

12          set

13           {

14                name = value;

15               if (PropertyChanged != null)

16                {

17                     PropertyChanged(this, new PropertyChangedEventArgs("Name"));

18                }

19            }

20        }

21 }

두 번째 귀속 방식:DependencyObject 인터페이스 구현(추천)--단축방법:propdp를 입력하고tab
 1  public class Person : DependencyObject

 2     {

 3         // 、DependencyProperty 、 +Property= DependencyProperty.Register(" ",typeof( ),

 4            // typeof( ),null);

 5 

 6         public static DependencyProperty NameProperty = DependencyProperty.Register("Name",typeof(string),

 7             typeof(Person),null);

 8 

 9         public string Name 

10         {

11             get

12             {

13                 return (string)GetValue(NameProperty);

14             }

15             set

16             {

17                 SetValue(NameProperty, value);

18             }

19         }

세 가지 바인딩 모드:
OneTime: 바인딩 생성 시 원본 데이터 업데이트 컨트롤을 사용합니다.(일반 set, get 속성일 수 있습니다.)
OneWay(기본값): 단방향 바인딩으로 바인딩을 만들 때 원본 데이터 업데이트 컨트롤을 사용하고 원본 데이터가 변할 때도 컨트롤을 업데이트합니다.INotify PropertyChanged 인터페이스를 구현하거나 Dependency Object에서 상속해야 합니다.Eval
TwoWay: 양방향 귀속, 데이터 원본의 변화는 컨트롤을 업데이트하고 컨트롤의 변화도 데이터 원본으로 업데이트합니다.INotify PropertyChanged 인터페이스를 구현하거나 Dependency Object에서 상속해야 합니다.Bind
 
 
덧셈 계산기:
클래스 정의:
 1  public class jiafa:DependencyObject

 2     {

 3         public int sum1

 4         {

 5             get { return (int)GetValue(sum1Property); }

 6             set { SetValue(sum1Property, value); }

 7         }

 8 

 9         // Using a DependencyProperty as the backing store for sum1.  This enables animation, styling, binding, etc...

10         public static readonly DependencyProperty sum1Property =

11             DependencyProperty.Register("sum1", typeof(int), typeof(jiafa), null);

12         public int sum2

13         {

14             get { return (int)GetValue(sum2Property); }

15             set { SetValue(sum2Property, value); }

16         }

17         public static readonly DependencyProperty sum2Property = DependencyProperty.Register("sum2",typeof(int),typeof(jiafa),null);

18  }

19 

20   public int result

21         {

22             get { return (int)GetValue(resultProperty); }

23             set { SetValue(resultProperty, value); }

24         }

25 

26         // Using a DependencyProperty as the backing store for result.  This enables animation, styling, binding, etc...

27         public static readonly DependencyProperty resultProperty =

28             DependencyProperty.Register("result", typeof(int), typeof(jiafa),null);

네임스페이스 가져오기
1  xmlns:ctrl="clr-namespace: 0819"
 1   <phone:PhoneApplicationPage.Resources>

 2         <ctrl:jiafa x:Key="jiafa"></ctrl:jiafa>

 3     </phone:PhoneApplicationPage.Resources>

 4     <!--LayoutRoot  -->

 5   <Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{StaticResource jiafa}">

 6         <TextBox Height="72" HorizontalAlignment="Left" Margin="12,127,0,0" Name="textBox1" Text="{Binding sum1,Mode=TwoWay}" VerticalAlignment="Top" Width="460" />

 7         <TextBox Height="72" HorizontalAlignment="Left" Margin="20,271,0,0" Name="textBox2" Text="{Binding sum2}" VerticalAlignment="Top" Width="460" />

 8         <Button Content=" " Height="72" HorizontalAlignment="Left" Margin="98,414,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click_1" />

 9         <TextBlock Height="44" HorizontalAlignment="Left" Margin="54,517,0,0" Name="textBlock1" Text="{Binding result}" VerticalAlignment="Top" Width="280" />

10     </Grid>

백그라운드 코드
1  private void button1_Click_1(object sender, RoutedEventArgs e)

2         {

3            jiafa jf=(jiafa)this.Resources["jiafa"];

4            jf.result = jf.sum1 + jf.sum2;

5            

6         }

데이터가 바인딩된 Converter:
이전에 계산기의 예에서 모델의 속성은 int 형식이지만 텍스트 상자의 Text 속성은string 형식이고 양방향으로 귀속할 수 있는 것은 값 변환기가 있기 때문이다.
그러나 우리가 데이터에서 꺼낸 값이 0과 1이면 각각 남자와 여자를 나타낸다.이때 시스템은 우리를 도와 복잡한 유형 전환을 할 수 없고 1을 남자로 만들어 사용자에게 보여줄 수 없다.
그래서 저희가 변환기를 하나 써야 돼요.
 
열거 정의:
1 Public enum Gender{ Female,Male,Unkown};
 1  public class GenderStringConverter:IValueConverter

 2     {

 3         // :Model UI 

 4         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

 5         {

 6             //value Model 

 7             // UI 

 8             Gender gender = (Gender)value;

 9             switch (gender)

10             {

11                 case Gender.Female:

12                     return " ";

13                 case Gender.Male:

14                     return " ";

15                 case Gender.Unkown:

16                     return " ";

17                 default :

18                     throw new Exception("Gender ");

19             }

20         }

21 

22         // UI , UI Model 

23         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

24         {

25             string s = (string)value;

26             switch (s)

27             {

28                 case " ":

29                     return Gender.Male;

30                 case " ":

31                     return Gender.Female;

32                 case " ":

33                     return Gender.Unkown;

34                 default :

35                     //throw new Exception();

36                     return Gender.Unkown;

37             }

38         }

39     }

변환기 사용법:
먼저 변환기가 필요한 페이지에 도입하기;
첫걸음
1 xmlns:my="clr-namespace:PhoneApp1"

두 번째 단계
1 <phone:PhoneApplicationPage.Resources>

2         <my:GenderStringConverter x:Key="genderStrConverter"></my:GenderStringConverter>

3 

4     </phone:PhoneApplicationPage.Resources>

세 번째 단계
1 <TextBox Text="{Binding Gender,Mode=TwoWay,Converter={StaticResource genderStrConverter}}"></TextBox>

 

좋은 웹페이지 즐겨찾기