我有一個失敗的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");
}
}
}
我怎麼會這麼愚蠢...... :( –
我知道這種感覺,盯着代碼足夠長,開始看東西。 – Laith