wpf 获取绑定了值得ListBox中的item的对象
我在界面中放了一个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 事件,但是不好用,不知道还有没有什么方法可以解决这个问题。
说的比较啰嗦,但是真的很紧急,感谢大家了~