如何从文本块中获取值,该文本块存在于列表框....
这是代码xaml:
<ListBox Height="707" HorizontalAlignment="Left" Margin="12,0,0,0" Name="listBox1" VerticalAlignment="Top" Width="456" Background="White" Foreground="#FF09090C" ItemsSource="{Binding}" SelectionChanged="listBox1_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Name="textBlock3" FontSize="18" Foreground="Blue" Margin="2" Text="{Binding Title.Text}" TextWrapping="Wrap" />
<TextBlock FontSize="16" Foreground="Gray" Margin="2" Text="{Binding Summary.Text}" TextWrapping="Wrap" />
<TextBlock FontSize="1" Foreground="Gray" Margin="2" Text="{Binding Id}" TextWrapping="Wrap" Visibility="Collapsed" />
<Button Name="h1" Content="Press" Height="10" Width="40"></Button>
<TextBlock Foreground="Gray" Margin="2" Text="________________________________________________________________________________________" FontSize="8"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 0 :(得分:0)
您没有直接从TextBlock获取值 相反,您所做的是将SelectedItem绑定到viewmodel上的属性。直接获取TextBlock的值会违反MVVM的原则(如果您使用该模式)。 viewmodel呈现数据,它不知道如何将数据呈现给UI。我不知道有三个TextBlock。
<ListBox Height="707" SelectedItem={Binding MyViewModelProperty} >
... etc ...
这意味着每次更改所选项目时,新值将填充到viewmodel上的bound属性中。您所要做的就是访问该对象 - 就像那样简单。这意味着您也可能能够摆脱SelectionChanged
事件连接,具体取决于它正在做什么。
但是,如果您坚持获取用于在列表控件中显示任何特定数据项的模板实例,那么这是以编程方式执行此操作的方法:
myListBox.ItemContainerGenerator.ContainerFromItem(myDataItem);
这将返回StackPanel及其内容,然后您可以使用FindName()或只是枚举子控件以找到您感兴趣的那个。
FrameworkElement element = myListBox.ItemContainerGenerator.ContainerFromItem(myDataItem) as FrameworkElement;
if (element != null)
FrameworkElement child = element.FindName("myChildName");