2013-06-17 5 views
1

Я не могу заставить пользовательский интерфейс реагировать на RaisePropertyChanged по какой-то причине. Хорошо застрял. CurrentClient - это часть, не стреляющая в пользовательский интерфейс. Действительно странно. Надеюсь, кто-то может мне помочь. Благодаря Скотт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, но я не вижу ничего в моем UI

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

Почему ваш 'ItemsSource' из' ListBox' установлен в 'ClientView 'вместо' ClientDetailsList' – Viv

+0

хорошо видно. Хотя список все еще работал. Я думал, что это решило бы, но все равно. Когда я нажимаю '_currentClient = value;' там правильная запись. спасибо за комментарии – scottsanpedro

ответ

1

Ok на самом деле не уверен, о вашей структуре кода, так как Я не могу воспроизвести вашу проблему с текущей информацией.

Однако пара вещей, которые могут быть вам стоит знать о том,

  • В InSelectedClient(...) аргумент уже типа ClientDetail делает as литой избыточными внутри функции.
  • Далее, почему вы используете только EventToCommand? вы держите ListBox выбранным товаром через EventToCommand в CurrentClient. Скорее просто привяжите его напрямую.

что-то вроде:

<ListBox ... 
     SelectedItem="{Binding CurrentClient}"> 
... 
  • Наконец Если у вас нет какой-либо конкретной логики в VM, относящиеся к CurrentClient и если там действительно нет необходимости проведения на нем, то вы можете получить избавившись от этого, связывая ваш TextBox непосредственно с ListBox.

что-то вроде

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

Я угадывание CM_Address1 является "собственностью" в ClientDetail классе

Теперь все эти подходы работают хорошо для меня. Я бы предложил собрать воспроизводимый автономный пример, если никто из них не работает для вас. Я могу приложить образец этих методов в демо, если вы хотите (не совсем уверен, что это будет очень полезно, если ваш код структурирован отлично)

+0

Hi Viv. Спасибо за это. EventToCommand существует, поскольку я использую datatemplate. Я начал с SelectedItem много часов назад, и это не сработало. Также привязка вашего текстового поля isn; t работает также. Я начинаю думать, что у меня есть ошибка из-за изменения некоторых ссылок и, возможно, закончилась коррупция. Я могу начать новый проект и запустить его, и посмотреть, не решает ли это его, не тратя слишком много времени. scott – scottsanpedro

+0

Это работает через прямой список, но не через шаблон данных. Я считаю, что это проблема. Спасибо за ваше время на этом – scottsanpedro

+0

Просто для ясности. Связывание текстового поля также работает через шаблон данных. – scottsanpedro