我想在页面初始化事件中更改文本块文本 这是我的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以便如何实现它?
答案 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; ..希望它有效!!