1

何らかの理由で UI が RaisePropertyChanged に応答できません。よく立ち往生。CurrentClient は UI に発火しない部分です。本当に奇妙です。うまくいけば、誰かが私を助けてくれます。ありがとうスコット

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" >
4

1 に答える 1

1

現在の情報では問題を再現できないため、コード構造についてはよくわかりません。

ただし、知っておく価値のあることがいくつかありますが、

  • 引数はInSelectedClient(...)すでに型でClientDetailありas、関数内でキャストを冗長にしています。
  • 次に、なぜEventToCommandこれに a を使用しているのですか? ListBoxで選択したアイテムを保持しEventToCommandますCurrentClient。むしろ、直接バインドしてください。

何かのようなもの:

<ListBox ...
         SelectedItem="{Binding CurrentClient}">
...
  • 最後に、VM に関連する特定のロジックがCurrentClientなく、それを保持する必要が本当にない場合は、TextBox直接ListBox.

何かのようなもの

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

クラスCM_Address1の「プロパティ」だと思いますClientDetail

現在、これらのアプローチはすべてうまく機能しています。これらのどれもうまくいかない場合は、再現可能なスタンドアロンの例をまとめることをお勧めします。必要に応じて、これらのメソッドのサンプルをデモに添付できます (コードの構造が大きく異なる場合に役立つかどうかはわかりません)。

于 2013-06-17T11:38:15.893 に答える