更改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,那么如何实现呢?

更改windowsphone 8中列表框中的文本块文本

您无法访问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"。。希望它能起作用!!