2017-10-07 75 views
1

我有一個失敗的DisplayMemberPath值。WPF DisplayMemberPath只在嵌套視圖/虛擬機時啓動

我的項目的設置是,我有一個ParentView,其中包含一個ChildView(這個子視圖,我簡化到單個控件失敗的這個問題)。父視圖的DataContext在虛擬機中設置爲父虛擬機,並使用DataTemplate設置ChildView的上下文。該DataTemplate在父視圖中設置。

問題:我需要顯示FileName,而不是我的ListBox中的FileInfo對象的FullFileName屬性值。我設置了DisplayMemberName,它在ChildView/UserControl中設置爲綁定時部分起作用。這只是在啓動應用程序時才起作用。如果我將一個FileInfo對象添加到我的ChildVM中 - 它將顯示在ListBox中,但不會顯示爲FileName。相反,我只是得到FullFileName。

原因是我錯過了一個觸發綁定的事件,但我並不完全確定我應該首先綁定這種方式。

這是功能代碼。請注意我爲了這個問題已經簡化了它。您可以忽略命名約定等。

這裏是usercontrol。它是一個包含FileInfo對象的列表框,我要將DisplayMemberName設置爲FileInfo.FileName值。

<UserControl x:Class="CatalogInterface.ctlDirFilesListBox" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:CatalogInterface" 
      xmlns:vm="clr-namespace:CatalogInterface.ViewModels" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 

    <Grid x:Name="MainControlGrid"> 
     <ListBox x:Name="FileListBox" 
       DisplayMemberPath="{Binding ElementName=Files, Path=Files.FileName}" 
       <!-- Also tried DisplayMemberPath="FileName" --> 
       ItemsSource="{Binding Files}" 
       SelectedItem="{Binding Path=SelectedFiles}" 
       SelectionChanged="ListBoxItem_SelectionChanged" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       Background="#FFFFFF" 
       Grid.Row="2" 
       Grid.Column="1" 
       Grid.ColumnSpan="3" 
       BorderThickness="0"> 
      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
        <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/> 
        <EventSetter Event="KeyDown" Handler="ListBoxItem_KeyDown"/> 
       </Style> 
      </ListBox.ItemContainerStyle> 
     </ListBox> 
    </Grid> 
</UserControl> 

這是我MainWindo查看這需要在用戶控件:

<Window x:Name="FCTWindow" x:Class="CatalogInterface.MainWindow" 
     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" 
     xmlns:local="clr-namespace:CatalogInterface" 
     xmlns:vm="clr-namespace:CatalogInterface.ViewModels" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="532"> 

    <Window.DataContext> 
     <vm:MainWindowViewModel /> 
    </Window.DataContext> 

    <!--#region Body Left Side Grid--> 
    <Grid x:Name="BodyGridLeft" Grid.Row="0" Grid.Column="0"> 
     <UserControl Content="{Binding DirFilesViewModel}"> 
      <UserControl.ContentTemplate> 
       <DataTemplate> 
        <local:ctlDirFilesListBox /> 
       </DataTemplate> 
      </UserControl.ContentTemplate> 
     </UserControl> 
    </Grid> 
    <!--#endregion Body Left Side--> 
</Window> 

這是虛擬機的用戶控件(用戶控件實際上是我簡化了這個quesiton更復雜的子視圖的一部分

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.IO; 

namespace CatalogInterface.ViewModels 
{ 
    public class DirFilesViewModel : ViewModelBase<DirFilesModel> 
    { 
     private object _selectedFiles; 
     private Messenger _messenger; 

     public object SelectedFiles 
     { 
      get { return _selectedFiles; } 
      set { 
       SetProperty<object>(ref _selectedFiles, value); 
       _messenger.SendMessage(this, "DirFilesListBox_SelectedDocumentChanged", _selectedFiles); 
      } 
     } 

     public ObservableCollection<FileInfo> Files { get; set; } 
     private DirFilesModel _model; 

     public DirFilesViewModel() 
     { 
      _model = new DirFilesModel(); 
      Files = new ObservableCollection<FileInfo>(); 
      this.OnPublishDirFiles(this, new MessageEventArgs("s", "o")); 
      _messenger = Messenger.Set_Messenger(); 
      _messenger.Register(OnPublishDirFiles, "PublishDirFiles"); 
     } 
     protected virtual void OnPublishDirFiles(object source, MessageEventArgs e) 
     { 
      PublishDirFiles(); 
     } 
     private void PublishDirFiles() 
     { 
      if (Files == null) { } //raise NullArgumentException 
      Files.Clear(); 
      foreach (FileInfo f in _model.Files) Files.Add(f); 
      OnPropertyChanged("Files.FileName"); 
     } 
    } 
} 

回答

2

豈不是DisplayMemberPath="Name":)在虛擬機中,當OnPublishDirFiles()被調用列表框更新?我沒有看到實際的「FileName」屬性。有NameFullName

+1

我怎麼會這麼愚蠢...... :( –

+0

我知道這種感覺,盯着代碼足夠長,開始看東西。 – Laith