绑定的ComboBoxItem不显示

时间:2014-02-25 15:41:38

标签: c# wpf mvvm

我有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

非常感谢任何帮助。

2 个答案:

答案 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