我有ComboBox
用于选择文件,根据用户要求,完整路径应显示在ComboBox
中,而只有文件名(减去目录)应显示在可选项目。我正在遵循MVVM模式,并且ComboBox
绑定到ViewModel中的FileInfo
类型的实例,其中还有ObservableCollection<FileInfo>
成为ItemsSource
。目前的XAML是这样的:
<ComboBox SelectedItem="{Binding FilePath}" ItemsSource="{Binding AvailableFiles}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Name="FilePathText" Text="{Binding FullName}" TextWrapping="WrapWithOverflow"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="False">
<Setter TargetName="FilePathText" Property="Text" Value="{Binding Name}"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}">
<Setter TargetName="FilePathText" Property="Text" Value="{Binding FullName}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
问题是,即使FilePath
的默认值是ItemsSource
中的可选项,并且绑定得当(我使用了Christian Moser的WPF Inspector来检查应用程序时的DataSource)开始),ComboBox
在选择值之前不显示任何内容。是什么造成的?由于ComboBoxItem's
IsSelected
属性为null,因此应显示FullName
对象的FileInfo
。
非常感谢任何帮助。
答案 0 :(得分:0)
您可能想要使用SelectedValue和SelectedValuePath。这就是我所做的,它对我有用。
我在代码中这样做但这应该仍然适用于Binding。 在C#中:
availableFiles.Add(new FileInfo(@"Program.cs"));
filebox.ItemsSource = availableFiles;
filebox.SelectedValue = new FileInfo(@"Program.cs");
filebox.SelectedValuePath = "FullName";
我的组合框是模板
<ComboBox Name="filebox">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Name="FilePathText" Text="{Binding FullName}" TextWrapping="WrapWithOverflow"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="False">
<Setter TargetName="FilePathText" Property="Text" Value="{Binding Name}"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}">
<Setter TargetName="FilePathText" Property="Text" Value="{Binding FullName}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
在你的情况下
<ComboBox Name="filebox" SelectedValue="{Binding FileInfoObject}" SelectedValuePath ="FullName">
更新此作品
<ComboBox Name="filebox" SelectedValuePath="Name" SelectedItem="{Binding FileInfoObject}" ItemsSource="{Binding AvailableFiles}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Name="FilePathText" TextWrapping="WrapWithOverflow"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="False">
<Setter TargetName="FilePathText" Property="Text" Value="{Binding Name}"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="True">
<Setter TargetName="FilePathText" Property="Text" Value="{Binding FullName}"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}">
<Setter TargetName="FilePathText" Property="Text" Value="{Binding FullName}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
答案 1 :(得分:0)
如果绑定点SelectedItem
内未包含ItemsSource
,则ComboBox
有将SelectedItem
设置为空的恶习。
尝试并暂缓更新SelectedItem
,直到填充ItemsSource
。