2012-07-17 4 views
1

나는 몇 번 질문했지만 알고있는 답변이 하나도 없다는 것을 알고 있습니다.바운드 UI 구성 요소 새로 고치기 강제로

이 요소 목록은 패널에서 매개 변수를 표시 할 때 클릭하면 (texboxes, 레이블, 콤보 및 기타 구성 요소 사용) TreeView에 있습니다. 또한 콤보에서 선택한 하나의 요소에서 데이터 패널에 현재 표시된 요소로 데이터를 복사 할 수있는 버튼이 있습니다 ("데이터 복사 ...").

패널의 모든 데이터는 클래스와 속성에 바인딩되며 트리 뷰는 해당 객체의 컬렉션에 바인딩됩니다.

문제는 복사 버튼을 누르면 (즉, 객체 A에서 현재 객체로 데이터 복사 중) 변경 사항이 반영되지 않습니다. 그러나 (TreeView에서 다른 객체를 클릭하여) 표시 할 요소를 변경 한 다음 변경된 객체로 돌아 가면 변경 사항이 있습니다. 실제로 실제 데이터를 변경하지만 데이터 바인딩을 새로 고치지는 않습니다.

이상하게도 복사 버튼을 두 번 누르면 실제로 변경 사항이 반영됩니다.

이 원인이 될 수 있으며 어떻게 해결할 수 있습니까?

이 (많이 있기 때문에 나는 단지 하나를 게시하고, 그들 중 누구도이 작동되지 않음) 업데이트해야 컨트롤의 XAML의 예입니다 복사 버튼 트 리뷰 :

Copiar datos 델 protocolo : Copiar

<TreeView SelectedItemChanged="TvProtocolosSelectedItemChanged" Margin="10,5" Name="tvProtocolos" HorizontalAlignment="Stretch" VerticalAlignment="Top" Width="200" Height="292" MinWidth="0"> 
        <TreeView.ItemContainerStyle> 
         <Style TargetType="TreeViewItem"> 
          <Setter Property="IsEnabled" Value="{Binding Path=Activo}"/> 
          <Setter Property="IsExpanded" Value="False"/> 
         </Style> 
        </TreeView.ItemContainerStyle> 
        <TreeView.ItemTemplate> 
         <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}"> 
          <StackPanel Orientation="Horizontal"> 
           <Image Source="imagenes\file_icon.gif" Margin="0,0,5,0" /> 
           <TextBlock Text="{Binding Path=Name}" ></TextBlock> 
          </StackPanel> 
         </HierarchicalDataTemplate> 
        </TreeView.ItemTemplate> 

       </TreeView> 

그리고이 코드 숨김 파일입니다

public partial class NewXP2 : Window 
    { 
     private const int nProtocolos = 100; 
     private Experiencia2 _exp2Class = new Experiencia2(nProtocolos); 
     private readonly TreeView _tvProtocolos; 


     public NewXP2() 
     { 
InitializeComponent(); 
_tvProtocolos.ItemsSource = _expClass.Protocolos; 
xpControlsPanel.DataContext = _exp2Class.GetProtocolo(0); 
      for(int i=0;i<nProtocolos;i++) 
       copyFromCombo.Items.Add("Protocolo " + (i+1)); 
      copyFromCombo.SelectedIndex = 0; 
} 

     private void CopyfromButtonClick(object sender, RoutedEventArgs e) 
     { 
      int protIndex = copyFromCombo.SelectedIndex; 

      int indiceProtocolo = 0; 
      if (_tvProtocolos == null) 
       return; 

      var g = _tvProtocolos.SelectedItem as Composite; 

      _listaData = GetData(); 
      _tvProtocolos.ItemsSource = _listaData; 
      TreeViewItem tvi; 
      if (g != null) 
      { 
       tvi = _tvProtocolos.ItemContainerGenerator.ContainerFromIndex(g.Indice) as TreeViewItem; 

       if (tvi != null) 
       { 
        tvi.IsSelected = true; 
       } 
       indiceProtocolo = g.Indice; 
      } 

      _exp2Class.SetProtocolo(indiceProtocolo, _exp2Class.Protocolos[protIndex]); 

     } 

그리고 이것은 (텍스트 상자에) 패널에 바인딩 클래스

public class ProtocoloExp2: ISerializable, IDataErrorInfo 
    { 
public ProtocoloExp2(int idx) 
     { 
      IndiceProtocolo = idx; 
      IndiceVisual = idx + 1; 
     } 
     public float TimeToShowTarget { get; set; } 

     (...) 
} 
+1

INotifyPropertyChanged 구현에서 문제가있는 것처럼 들리지만 관련 코드 샘플이 없으면 알기 어렵습니다. – Alex

+0

게시해야 할 것은 무엇입니까? 내 수업에서 그 인터페이스를 사용하지 않습니다. 나는 여기서 뭔가를 잃을지도 모른다고 생각합니다 ... –

+0

문제의 가능한 가장 작은 글을 게시하십시오. –

답변

2

확인하다 "How to: Implement the INotifyPropertyChanged Interface" 그리고 귀하의 목록에 ObservableCollection을 사용해보십시오. INotifyPropertyChanged 인터페이스의 구현은 wpf 컨트롤 뷰 모델의 요구 사항입니다. 기본적으로 뷰가 데이터를 변경할 때 뷰를 새로 고칠 수 있습니다.

+0

제 바인딩이 지금까지 완벽하게 두 방향 모두에서 작동 했음에도 불구하고 그것을 조사 할 것입니다. –

+1

속성 양식 코드가 표시된 후이를 변경하지 않으면 "데이터 복사 ..."단추를 클릭하십시오. – Rafal

관련 문제