2013-06-17 4 views
1

어떤 이유로 든 UI가 RaisePropertyChanged에 응답하지 못합니다. 잘 붙어있어. CurrentClient는 UI에 실행되지 않는 부분입니다. 정말 이상해. 누군가 나를 도와 줄 수 있기를 바랍니다. 감사합니다 스콧MVVM Light RaisePropertyChanged

public class ClientViewModel : ViewModelBase 
{ 
    public RelayCommand<ClientDetail> SelectedClient { get; private set; } 
    public ICollectionView ClientView { get; private set; } 

    private readonly IClients _clientsService; 
    public ClientViewModel(IClients clientsService) 
    { 
     _clientsService = clientsService; 
     SelectedClient = new RelayCommand<ClientDetail>(InSelectedClient); 
     ClientDetailsList = new ObservableCollection<ClientDetail>(_clientsService.LoadClientList()); 
     //CurrentClient = ClientDetailsList.ToList().FirstOrDefault(); 
     ClientView = CollectionViewSource.GetDefaultView(ClientDetailsList); 
    } 

    private void InSelectedClient(ClientDetail obj) 
    { 
     CurrentClient = obj as ClientDetail; 

    } 

    private ObservableCollection<ClientDetail> _clientDetailsList; 
    public ObservableCollection<ClientDetail> ClientDetailsList 
    { 
     get { return _clientDetailsList; } 
     set { _clientDetailsList = value; 
      RaisePropertyChanged("ClientDetailsList"); } 
    } 

    private ClientDetail _currentClient; 
    public ClientDetail CurrentClient 
    { 
     get { return _currentClient; } 

     set 
     { 
      if (_currentClient == value) 
      { return; } 

      _currentClient = value; 
      RaisePropertyChanged("CurrentClient"); 
     } 
    } 
} 

내 XAML :

<ListBox Name="lbClientList" 
ItemsSource="{Binding ClientView}" ItemTemplate="{DynamicResource DTClientList}" 
Background="{x:Null}" BorderThickness="0,0,1,0" BorderBrush="#FF434343" > 
<ListBox.Resources> 
<DataTemplate x:Key="DTClientList"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock TextWrapping="Wrap" Text="{Binding CM_CompanyID}" Margin="0,0,5,0" Width="25" Foreground="#FF3590FC"/> 
     <TextBlock TextWrapping="Wrap" Text="{Binding CM_CompanyName}" Width="150" Foreground="#FF3590FC"/> 
     <TextBlock TextWrapping="Wrap" Text="{Binding CM_MainContact}" Width="100" Foreground="#FF3590FC"/> 
    </StackPanel> 
    </DataTemplate> 
     </ListBox.Resources> 
        <i:Interaction.Triggers> 
        <i:EventTrigger EventName="SelectionChanged"> 
      <Command:EventToCommand Command="{Binding SelectedClient, Mode=OneWay}" CommandParameter="{Binding SelectedItem, ElementName=lbClientList}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
<ListBox.DataContext> 
<Binding Path="ClientView" Source="{StaticResource ServiceLocator}" UpdateSourceTrigger="PropertyChanged"/> 
     </ListBox.DataContext> 
    </ListBox> 

코드를 디버깅에서이 RaiseProertyChange을 타격하지만 이후 코드 구조에 대한

<TextBox Text="{Binding CurrentClient.CM_Address1}" TextWrapping="Wrap" VerticalAlignment="Center" Width="210" Background="{DynamicResource MainBackgrouund}" BorderThickness="0,0,0,1" > 
+0

'ListBox'의'ItemsSource'가'ClientView '로 설정된 이유는 무엇입니까? 'ClientDetailsList' 대신에 – Viv

+0

을 발견했습니다. 목록은 여전히 ​​작동했지만. 나는 그것이 그것을 해결했을 것이라고 생각했지만 여전히 동일합니다. '_currentClient = value;'를 누르면 올바른 기록이 있습니다. 댓글 주셔서 감사합니다 – scottsanpedro

답변

1

좋아 정말 확실하지 내 UI에 아무것도 볼 수 없습니다입니다 현재 정보로 문제를 재현 할 수 없습니다.

그러나 당신에 대해 알고 가치가있을 수도 있습니다 몇 가지, InSelectedClient(...)에서

  • 인수가 이미 유형 ClientDetail 기능 내부의 as 캐스트가 중복 만드는 것입니다.
  • 다음은 왜 EventToCommand입니다. EventToCommand을 통해 ListBox 선택한 항목을 CurrentClient에 보관합니다. 오히려 그것을 직접 바인딩하십시오.

뭔가 같은 : 마지막으로

<ListBox ... 
     SelectedItem="{Binding CurrentClient}"> 
... 
  • 당신은 VM에서 특정 논리가 CurrentClient에 관한 정말 그것을 들고 할 필요가없는 경우에, 당신이 얻을 수없는 경우 TextBoxListBox에 직접 바인딩하여 제거하십시오. 내가 CM_Address1 같은데요

    <TextBox Text="{Binding ElementName=lbClientList, Path=SelectedItem.CM_Address1}" /> 
    

    같은

뭔가

지금이 모든 방법은 나를 위해 잘 작동 ClientDetail 클래스의 "속성"입니다. 이들 중 어느 것도 당신을 위해 일하지 않는다면 재현 할 수있는 독립 실행 형 예제를 함께 제안하는 것이 좋습니다. 데모에서 이러한 메소드 샘플을 첨부 할 수 있습니다 (코드가 잘 구조화되어 있다면 코드가 다르게 도움이 될 것입니다).

+0

안녕하세요. 고마워. eventToCommand는 datatemplate을 사용하면서 거기에 있습니다. 나는 몇 시간 전에 SelectedItem을 시작했는데 성공하지 못했습니다. 또한 귀하의 텍스트 바인딩 isn도 작동하지 않습니다. 나는 잠시 동안 일부 참고 문헌을 바꿔서 버그가 있다고 생각하기 시작했다. 나는 새 프로젝트를 시작하고이 프로젝트를 실행하여 너무 많은 시간을 낭비하지 않으면 서 해결할 수 있는지 살펴볼 것입니다. scott – scottsanpedro

+0

이것은 똑바로 앞으로의 목록 상자를 통해 작동하지만 데이터 템플릿을 통해 작동하지 않습니다. 그게 문제라고 믿습니다. 이 – scottsanpedro

+0

에 시간을내어 주셔서 감사합니다. 명확성을 위해서. 텍스트 상자 바인딩은 데이터 템플릿을 통해 작동합니다. – scottsanpedro

관련 문제