更改windowsphone 8中列表框中的文本块文本
本文关键字:文本 列表 windowsphone 更改 | 更新日期: 2023-09-27 18:28:45
我想更改页面初始化事件中的文本块文本这是我的xaml
<ListBox Margin="3,60,1,10" BorderThickness="2" Grid.Row="1" Name="lstAnnouncement" Tap="lstAnnouncement_Tap" Width="476" d:LayoutOverrides="VerticalMargin">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Name="thispanel" Grid.Row="1" Orientation="Horizontal" Height="120" Width="478" >
<StackPanel.Background>
<ImageBrush ImageSource="Images/Text-ALU.png" Stretch="Fill" />
</StackPanel.Background>
<Grid HorizontalAlignment="Left" Width="30" Margin="0,0,0,2" Background="#FF0195D5" Height="118">
<TextBlock x:Name="txtDate" TextWrapping="Wrap">
</TextBlock>
</Grid>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我想更改txtDate.在代码隐藏中使用c#的文本,但在代码隐藏中将无法访问txtDate,那么如何实现呢?
您无法访问txtDate对象的原因是它包含在您用于ListBox的DataTemplate中。这不是一个错误-DataTemplate正在应用于添加到ListBox的每一个项目。
假设ListBox创建了一个网格,其中包含一个名为"txtDate"的TextBlock,对于添加到其中的每一项,访问txtDate对象意味着什么?当您引用txtDate时,您的程序将如何决定与相同数量的ListBoxItems关联的(功能上)无限数量的txtDate中的哪一个?
如果您希望能够轻松更改txtDate的内容,则需要将ListBox的ItemsSource绑定到ViewModel中的属性。最简单的方法是将该属性设置为包含自定义模型类型的IEnumerable。通过这种方式,您可以更新该模型的文本属性,并对该属性调用NotifyPropertyChanged,UI将更新以反映新数据。
这里有一个例子:
public class YourViewModel
{
public List<YourModel> Models { get; set; }
}
public class YourModel : INotifyPropertyChanged
{
private string yourText;
public string YourText
{
get { return yourText; }
set
{
yourText = value;
NotifyPropertyChanged("YourText");
}
}
// add INotifyPropertyChanged implementation here
}
然后,您需要将ListBox的ItemsSource绑定到YourViewModel的Models属性,并将TextBox的文本绑定到your Model的YourText属性。任何时候更改YourModel.YourText属性时,它都会在UI上自动更新。我认为让您的模型实现INotifyPropertyChanged是否是合适的MVVM可能会引起争论,但我发现在这种情况下,这比每次对其中一个模型进行更改时强制ViewModel更新每个模型要容易得多。
如果您不熟悉与WPF一起使用的MVVM模式,这可能是一个良好的开端:MVVM示例。
此函数将帮助您。。。这将帮助您在列表框运行时中找到控件
public FrameworkElement SearchVisualTree(DependencyObject targetElement, string elementName)
{
FrameworkElement res = null;
var count = VisualTreeHelper.GetChildrenCount(targetElement);
if (count == 0)
return res;
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(targetElement, i);
if ((child as FrameworkElement).Name == elementName)
{
res = child as FrameworkElement;
return res;
}
else
{
res = SearchVisualTree(child, elementName);
if (res != null)
return res;
}
}
return res;
}
这里的第一个参数是parent,第二个参数是元素的名称,在您的情况下是"txtDate"。。希望它能起作用!!