WPF两个基于相同列表的组合框
本文关键字:列表 于相同 组合 两个 WPF | 更新日期: 2023-09-27 18:14:01
我对WPF工作相当陌生,并且有这个简单的场景,我希望实现:
我有两个组合框,cmbSite和cmbLogFiles,我有一个List<LogFileDirectory>
定义如下:
class LogFileDirectory
{
public List<System.IO.FileInfo> Files { get; private set; }
public string Name { get; private set; }
public string Path { get; private set; }
private LogFileDirectory() { }
public LogFileDirectory(string name, string path)
{
this.Name = name;
this.Path = path;
this.Files = new List<System.IO.FileInfo>();
if (System.IO.Directory.Exists(this.Path))
{
foreach (string file in System.IO.Directory.GetFiles(this.Path, "*.log", System.IO.SearchOption.TopDirectoryOnly))
this.Files.Add(new System.IO.FileInfo(file));
}
}
}
我将cmbSite绑定到List<LogFileDirectory>
上的Name属性,如下所示:
cmbSite.ItemsSource = _logFileInfo.WebServerLogFileDirectories;
cmbSite.SelectedValue = "Path";
cmbSite.DisplayMemberPath = "Name";
我希望cmbLogFiles绑定到当前选定的cmbSite的相同List<LogFileDirectory>
上的Files属性,并过滤到cmbSite当前选定值的条目LogFileDirectory对象,但我真的不太确定如何在cmbSite的ClickEvent处理程序中编写代码(这似乎是基于我的WPF研究的错误方法)并将cmbLogFiles重新绑定到选择的cmbSite LogFileDirectory。
根据@Chris在上面的评论中给我指出的线程,解决方案很简单。
<ComboBox Name="cmbLogFiles" Width="140" ItemsSource="{Binding SelectedItem.Files, ElementName=cmbSite}" />
其中cmbLogFiles的ItemsSource属性指定绑定将是SelectedItem对象(定义为LogFileDirectory对象)的Files属性,并通过我的其他组合框(cmbSites)的Element属性指定。
我能够通过在我的窗口上设置一个DataContext来删除后面的所有代码:
parserView = new Parser();
parserView.DataContext = new LogFileInfo("deathstar");
然后是解析器窗口的后续XAML:
<Window x:Class="Zapora.UI.Parser"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Log File Parser" Height="350" Width="525">
<StackPanel Orientation="Horizontal" Height="26" VerticalAlignment="Top">
<Label Content="Web Site:"/>
<ComboBox Name="cmbSite" Width="180" ItemsSource="{Binding WebServerLogFileDirectories}" DisplayMemberPath="Name" SelectedValuePath="Path"/>
<Label Content="Files Available:"/>
<ComboBox Name="cmbLogFiles" Width="140" ItemsSource="{Binding SelectedItem.Files, ElementName=cmbSite}" />
</StackPanel>
</Window>