wpf 获取绑定了值得ListBox中的item的对象

fll7788 2014-09-19 11:32:09
我在界面中放了一个Listbox,listbox中的数据模板是采用Button来显示内容的,xaml代码如下:
<ListBox x:Name="ListBoxName" HorizontalAlignment="Left" ItemsSource="{Binding Buttonlist}" Height="244" Margin="20,10,0,0" VerticalAlignment="Top" Width="168">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel Orientation="Horizontal">
<Button Name="itembtn" Content="{Binding }" Height="20" />
</StackPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="itembtn" Property="Focusable" Value="True"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
ViewModel层中的代码如下:
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChange(string PropertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}
private List<string> buttonlist;

public List<string> Buttonlist
{
get { return buttonlist; }
set { buttonlist = value;
NotifyPropertyChange("Buttonlist");
}
}
public viewmodel()
{
// listtest = new ObservableCollection<string>();
// listtest.CollectionChanged += List_CollectionChanged;
// status = "on";
// buttonlist = new List<string>();
for (int i = 0; i < 7; i++)
{
buttonlist.Add("button" + i.ToString());
}
while(buttonlist.Count > 5)
{
buttonlist.RemoveAt(0);
}
}

这样可以成功的现实内容。
我在界面中放了一个Button,点击该Button时使Viewmodel层中的Buttonlist被清空,然后重新设值,
这个代码写在了界面对应的.cs文件下,代码如下:(不过不知道为什么,点击了这个Button,界面内容并没有发生变化,但这不是我主要要问的,如果能回答为什么就更好了)
private void Button_Click_2(object sender, RoutedEventArgs e)
{
vm.Buttonlist.Clear();
for (int i = 0; i < 4; i++)
{
vm.Buttonlist.Add("NewName" + i.ToString());
}
}
现在,我要说明我想要干什么了,我想要获取在ListBox中的每一个button对象。例如在没有点击Button前,
我获取的到Listbox中的每一个button对象,当这个ListBox中绑定对象(Buttonlist)的值变化后(点击Button使它产生变化只是我想到的一种方式,实际是在viewmodel层中使Buttonlist产生变化),我想再次获取Listbox中的button对象。目前遇到的困难时,当Listbox绑定的对象(ButtonlIst)的值产生变化使,我就无法获取到Button对象。因此我认为缺少一个事件来通知我改什么时候去获取Button对象。
获取Button对象的方法如下:
private T SearchVisualTree<T>(DependencyObject tarElem) where T : DependencyObject
{
if (tarElem != null)
{
var count = VisualTreeHelper.GetChildrenCount(tarElem);
if (count == 0)
return null;
for (int i = 0; i < count; ++i)
{
var child = VisualTreeHelper.GetChild(tarElem, i);
if (child != null && child is T)
{
return (T)child;
}
else
{
var res = SearchVisualTree<T>(child);
if (res != null)
{
return res;
}
}
}
return null;
}
private void GetBtn()
{
for (int i = 0; i < this.ListBoxName.Items.Count; i++)
{
ListBoxItem itemtemp = this.ListBoxName.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
Button buttonobject = SearchVisualTree<Button>(itemtemp);
if (buttonobject == null) break;
buttonobject.Margin = new Thickness(10, 10, 10, 10);
}
}

目前,我可以在界面加载的方法中调用GetBtn()方法,能够成功的得到此时的Listbox中的Button对象。
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
GetBtn();
// this.ListBoxName.Items.CurrentChanged += Items_CurrentChanged;
}

但是,就是在 Buttonlist变化的时候没有办法再次获取到Listbox中的Button对象了。
我尝试过 this.ListBoxName.Items.CurrentChanged 事件,但是不好用,不知道还有没有什么方法可以解决这个问题。

说的比较啰嗦,但是真的很紧急,感谢大家了~

...全文
751 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fll7788 2014-09-22
  • 打赏
  • 举报
回复
以项目为前提,我的解决思路跟我问的就不太一样。我也有点说不清楚。不过我可以说一下自己在解决问题过程中想到的各种思路。 思路1:就是我的问题中的思路,即通过View中的ListBox中的Item的变化获取对象。 思路2:是通过ViewModel层中ObservableCollection中的事件CollectionChanged获取变化时的Button对象。 其实还想了大概两三种思路,不过现在有点忘了。 就说这些,希望给大家一些提示。
fll7788 2014-09-22
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
试试,http://blog.csdn.net/duanzi_peng/article/details/17094639
虽然您的答案不是我想要的,但是依旧感谢您的回答。 我的问题已经解决。

8,741

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧