none
se pierde el enlace (binding) RRS feed

  • Pregunta

  • uso silverlight 4 y tengo el siguiente problema:

    Por un lado tengo una lista ObservableCollection<T> como origen de datos de un ComboBox,

    la propiedad SelectedValue del comboBox, esta enlazada a una propiedad del DataContextel cual implementa INotifyPropertyChanged, (la propiedad se llama ID)

     

    cuando seleccione un elemento del combo el selectedValue actualiza la propiedad (ID) a la cual esta enlazada y

    cuando cambio el ID desde el código, la propiedad selectedValue del combobox cambia

     

    El problema surge cuando cambio la propiedad (ID) por un valor que no esta el la lista a la cual esta enlazada el ComboBox, obteniendose como

    resultado que el enlace del SelectedValue del ComboBox se rompa. (Aquí el código)

     

     

    namespace
     SilverlightApplication21
    {
     public
     partial
     class
     MainPage : UserControl
     {
     view view = new
     view();
     
     ObservableCollection<Numero> NUM = new
     ObservableCollection<Numero>();
     public
     MainPage()
     {
      InitializeComponent();
      this
    .DataContext = view;
    
      this
    .comboBox1.DisplayMemberPath = "Num"
    ;
      this
    .comboBox1.SelectedValuePath = "Id"
    ;
      this
    .comboBox1.ItemsSource = NUM;
    
      NUM.Add(new
     Numero { Id = 1, Num = "uno"
     });
      NUM.Add(new
     Numero { Id = 2, Num = "dos"
     });
      NUM.Add(new
     Numero { Id = 3, Num = "tres"
     });
      NUM.Add(new
     Numero { Id = 4, Num = "cuatro"
     });
      NUM.Add(new
     Numero { Id = 5, Num = "cinco"
     });
     }
    
     private
     void
     button1_Click(object
     sender, RoutedEventArgs e)
     {
      this
    .comboBox1.SelectedValue = 10;
     }
     }
    
     public
     class
     view : INotifyPropertyChanged
     {
     public
     view() { }
    
     private
     object
     Idvalue;
     public
     object
     Id
     {
      get
     { return
     Idvalue; }
      set
    
      {
      Idvalue = value;
      this
    .RaisePropertyChanged("Id"
    );
      }
     }
    
     #region
     INTERFAZ - INotifyPropertyChanged
     public
     event
     PropertyChangedEventHandler PropertyChanged;
    
     public
     void
     RaisePropertyChanged(string
     strNameProperty)
     {
      if
     (this
    .PropertyChanged != null
    )
      {
      this
    .PropertyChanged(this
    , new
     PropertyChangedEventArgs(strNameProperty));
      }
     }
    
     #endregion
        
     }
    public
     class
     Numero
     {
     public
     Numero() { }
    
     private
     int
     Idvalue;
     public
     int
     Id
     {
      get
     { return
     Idvalue; }
      set
     { Idvalue = value;}
     }
    
     private
     string
     Numerovalue;
     public
     string
     Num
     {
      get
     { return
     Numerovalue; }
      set
     {Numerovalue = value;}
     }
     }
    }
    
    

    y el xaml

    <UserControl x:Class="SilverlightApplication21.MainPage"
      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"
      mc:Ignorable="d"
      d:DesignHeight="300" d:DesignWidth="400">
    
      <Grid x:Name="LayoutRoot" Background="White">
      <ComboBox Height="23" HorizontalAlignment="Left" Margin="93,42,0,0"
           Name="comboBox1" VerticalAlignment="Top" Width="164"
           SelectedValue="{Binding Id, Mode=TwoWay, TargetNullValue=1}"/>
      <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="263,42,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
      <TextBlock Height="23" HorizontalAlignment="Left" Margin="93,12,0,0" Name="textBlock1"
            Text="{Binding Id}" VerticalAlignment="Top" Width="143" />
     </Grid>
    </UserControl>

     



     

     

     


    alfredo pablo
    miércoles, 1 de septiembre de 2010 1:55

Todas las respuestas