WPF:WrapPanel容器的模板数据绑定(ItemsControl)
问题:
有⼀些CheckBox需要作为选项添加到页⾯上,但是数⽬不定。⽽为了⽅便排版,我选择⽤WrapPanel⾯板来作为⽗容器。那现在的问题就是如何把这些控件添加到这个WrapPanel⾥了。我想到了两个⽅法,第⼀个是先得到控件数⽬,然后再动态⽣成并加载到这个WrapPanel⾥,第⼆个是设置数据绑定。我想第⼀个是可⾏的,但是项⽬中还涉及到其它问题,所以这⾥就选择第⼆个了。问题来了,在WrapPanel中并没有可以⽤来设置绑定并实现动态⽣成的东西,那要怎么解决了?
办法:
新建⼀个ItemsControl控件,并为ItemsSource绑定数据源,然后把ItemsControl.ItemsPanel设置为WrapPanel,最后为ItemsControl.ItemTemplate中的CheckBox.Content绑定数据。
eg:
1、创建数据源类型。
public class business
{
public string txt { get; set; }
}
2、设置数据源
public MainWindow()
{
this.InitializeComponent();
List<business> che = new List<business>()
{
new business() { txt = "选项1"},
new business() { txt = "选项2"},
new business() { txt = "选项3"},
new business() { txt = "选项4"},
new business() { txt = "选项5"},
new business() { txt = "选项6"},
new business() { txt = "选项7"}
};
ItemsControl.ItemsSource = che;
}
3、Xaml中
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Padding="3">
<WrapPanel>
<CheckBox Content="{Binding txt}"/>
</WrapPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
调试⼀下就OK了。
================================================================================================
情况1:在设定DataTemplate的Name,并且他是在前台表⽰时,获取DataTemplate⾥的指定控件。
⽅法:
情况2:当没有设定DataTemplate的Name或是以Resource⽅式调⽤时,获取DataTemplate⾥的指定控件。
⽅法:
1、这⾥需要有⼀个从DataTemplate⾥获取控件的函数
public T FindFirstVisualChild<T>(DependencyObject obj, string childName) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T && child.GetValue(NameProperty).ToString() == childName)
{
return (T)child;
}
{
T childOfChild = FindFirstVisualChild<T>(child, childName);
if (childOfChild != null)
{
return childOfChild;
}
}
}
return null;
}
2、稍微改动⼀下前篇⾥的代码:
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Padding="3">
<WrapPanel>
<TextBox x:Name="txtID"/>
<TextBlock x:Name="txtName" Text="Good"/>
</WrapPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
或者
<Page.Resource>
<DataTemplate x:Key="data">
<Border Padding="3">
<WrapPanel>
<TextBox x:Name="txtID"/>
<TextBlock x:Name="txtName" Text="Good"/>
</WrapPanel>
</Border>
</DataTemplate>
</Page.Resources>
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1" ItemTemplate="{StaticResource data}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
htmlborder3、解下来就写按钮的处理函数:
我需要获取DataTemplate⾥名为"txtName"的TextBlock控件并显⽰他的Text内容。
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
TextBlock txt = FindFirstVisualChild<TextBox>(itemsControl, "txtName");
if (txt != null)//判断是否到
MessageBox.Show(txt.Text.ToString());
}
情况3:当没有设定DataTemplate的⾥的控件Name或者你压根不知道⾥⾯有哪些控件,但是你⼜想获取他们的值时。例如上⼀篇,当我动态⽣成CheckBox后,我想知道哪些CheckBox 被选中了。
⽅法:
1、也需要⼀个获取DataTemplate控件的函数,但是返回的是⼀个集合。
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
List<T> childList = new List<T>();
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
{
childList.Add((T)child);
}
childList.AddRange(GetChildObjects<T>(child, ""));//指定集合的元素添加到List队尾
return childList;
}
2、xaml中代码(详细请看前⼀篇)
<ItemsControl x:Name="itemsControl" Background="#B28BB2F1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Padding="3">
<WrapPanel>
<CheckBox Content="{Binding txt}"/>
</WrapPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
3、解下来就写按钮的处理函数:
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
DataVisualTreeHelper VTHelper = new DataVisualTreeHelper();
List<CheckBox> collection = VTHelper.GetChildObjects<CheckBox>(itemsControl, "")//第2个参数为空,表⽰查所有指定类型的控件(返回
⼀个CheckBox集合)
foreach (CheckBox item in collection //遍历这个集合
{
if (item.IsChecked == true)
MessageBox.Show(item.Content.ToString() + "被选中了!");
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论