Как передать кнопке текст из IEnumerable?
Полный вопрос такой: WPF. Мне нужно в Grid (или в каком элементе лучше? Я совсем зеленый) сделать динамически создаваемые кнопки, которые отображают имена найденных пользователей в AD. Как мне динамически создать кнопки и как передать в них каждый элемент из IEnumerable? Мой код IEnumerable string
public IEnumerable<string> UsersList(string UserName)
{
DirectoryEntry rootDSE = new DirectoryEntry(GetCurrentDomainPath());
DirectorySearcher userSearch = new DirectorySearcher(rootDSE)
{
PageSize = 50,
Filter = "(&(objectCategory=User)(objectClass=person)(name=" + UserName + "*))"
};
userSearch.PropertiesToLoad.Add("cn");
using (var results = userSearch.FindAll())
{
foreach (SearchResult result in results)
{
yield return (string)result.Properties["name"][0];
}
}
}
Ответы (1 шт):
Автор решения: Nick
→ Ссылка
если я правильно понял, то решение следующее: Xaml:
<Window x:Class="StackOverflowQuestHelp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:StackOverflowQuestHelp"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" x:Name="ThisWindow">
<Window.DataContext>
<local:MainWindowViewModel></local:MainWindowViewModel>
</Window.DataContext>
<Grid>
<ItemsControl ItemsSource="{Binding Users}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Button Content="{Binding .}"></Button>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid></Window>
ViewModel:
public class MainWindowViewModel: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
private IEnumerable<string> _Users;
public IEnumerable<string> Users
{
get { return _Users; }
set
{
_Users = value;
OnPropertyChanged();
}
}
public MainWindowViewModel()
{
ObservableCollection<string> Users = new ObservableCollection<string>();
for (int i = 0; i < 10; i++)//Генерируем пользователей у вас они должны подтягиваться из AD
{
Users.Add("User" + i);
}
this.Users = Users;
}
}
Результат:
Если вы хотите, действительно динамического обновления, то коллекция, которая будет биндится к ItemsControl должна реализовывать INotifyCollectionChanged, например ObservableCollection
