ListBox中的扩展器在第一次从绑定扩展时不显示内容

时间:2013-05-09 11:13:31

标签: wpf c#-4.0 data-binding

我有一个对话框窗口,其中包含ListBox,其ItemTemplate包含一个扩展器。 其IsExpanded绑定到项视图模型中的属性。 ListBoxItem的{​​{1}}属性也绑定到项视图模型对象中的IsSelected属性。最后,IsExpanded的{​​{1}}属性绑定到视图模型中具有相同名称的属性。

这里的问题是,在显示对话框并将其设置为对话框的SelectedItem之前设置视图模型时,列表框中的项目会被选中,扩展箭头显示它是处于展开状态,但不显示扩展器的内容。

如果我在显示对话框后设置了视图模型,例如。在对话框的Loaded处理程序中,事情按预期工作。这里发生了什么,以及解决它的最佳方法是什么?

对话框窗口定义为:

ListBox

ViewModel (为简洁起见,不包括实现):

DataContext

然后我有一个带按钮的简单主窗口,其<Window x:Class="WpfApplication1.Dialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:l="clr-namespace:WpfApplication1" Title="Dialog" Height="300" Width="300"> <Grid> <ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> <ListBox.ItemTemplate> <DataTemplate> <Expander Header="Expander" x:Name="MyExpander" IsExpanded="{Binding IsExpanded, Mode=TwoWay}"> <Rectangle Width="100" Height="20" Fill="Red" /> </Expander> </DataTemplate> </ListBox.ItemTemplate> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="IsSelected" Value="{Binding IsExpanded, Mode=TwoWay}" /> </Style> </ListBox.ItemContainerStyle> </ListBox> </Grid> 处理程序定义为:

public interface IMyViewModel : INotifyPropertyChanged
{
   object SelectedItem { get; set; }
   ObservableCollection<IMyItemViewModel> Items { get; }
}

public interface IMyItemViewModel : INotifyPropertyChanged
{
   bool IsExpanded { get; set; }
}

当我运行应用程序并单击按钮时,对话框显示,扩展箭头表示它处于展开状态,但不显示其内容。单击扩展器将其折叠,然后再次单击它会展开它,这次显示内容。 将相同的代码直接放在主窗口而不是对话框中然后按预期工作。

如果我只是做一个Click而不是直接设置它,事情似乎也有效,但这感觉有些不稳定。

可以采取哪些措施来解决这个问题?

1 个答案:

答案 0 :(得分:2)

如果IsExpanded属性已设置为true,则在加载后不会再次测量扩展器的内容。换句话说,内容是在没有实际大小的情况下进行测量的。

我认为最简单的解决方案是在加载对话框后设置SelectedItem

dialog.Loaded += (s, x) => vm.SelectedItem = item;