更改Windows Phone 8中列表框内的文本块文本

时间:2014-11-01 05:59:43

标签: c# xaml windows-phone-8 listbox

我想在页面初始化事件中更改文本块文本 这是我的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>

我想在代码隐藏中使用c#更改txtDate.Text但是后面的代码无法访问txtdate以便如何实现它?

2 个答案:

答案 0 :(得分:2)

您无法访问txtDate对象的原因是因为它包含在您用于ListBox的DataTemplate中。这不是错误 - DataTemplate应用于添加到ListBox的每个项目。

鉴于ListBox在其他控件中创建了一个包含名称为“txtDate”的TextBlock的Grid,对于添加到其中的每个项目,访问 txtDate对象意味着什么?当你引用txtDate时,你的程序将如何决定哪个(功能上)无限数量的txtDates与你想要的相同数量的ListBoxItem相关联?

如果您希望能够轻松更改txtDate的内容,则需要将ListBox的ItemsSource绑定到ViewModel中的属性。最简单的方法是将该属性设置为包含自定义模型类型的IEnumerable。这样,您可以更新该模型的text属性并在该属性上调用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的文本绑定到YourModel的YourText属性。每次更改YourModel.YourText属性时,它都会在UI上自动更新。我认为让你的模型实现INotifyPropertyChanged是否是正确的MVVM可能会受到争议,但我发现在这些情况下,每次对其中一个模型进行更改时强制ViewModel更新每个模型都会更容易。

如果您不熟悉WPF使用的MVVM模式,这可能是一个好的开始:MVVM example

答案 1 :(得分:1)

这个函数可以帮助你...这将有助于你在列表框运行时内找到控件。

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,第二个参数是元素的名称,在你的情况下是&#34; txtDate&#34; ..希望它有效!!