Как я могу добавить новую запись в мою коллекцию ObservableCollection - PullRequest
0 голосов
/ 30 января 2020

Я использую ObservableCollection для создания списка в моем приложении WPF.

public partial class NameList : ObservableCollection<SetCredentialsForAD>
{
    public NameList() : base()
    {
        using var forest = Forest.GetCurrentForest();
        Forest currentForest = Forest.GetCurrentForest();
        DomainCollection domains = currentForest.Domains;
        foreach (Domain objDomain in domains)
        {
            Add(new SetCredentialsForAD("domain", "name", "password"));
        }
    }
}

public class SetCredentialsForAD
{
    private string loginName;
    private string passWord;
    private string domainName;

    public SetCredentialsForAD(string domain, string lName, string pWord)
    {
        this.domainName = domain;
        this.loginName = lName;
        this.passWord = pWord;
    }

    public string DomaineName
    {
        get { return domainName; }
        set { domainName = value; }
    }

    public string LoginName
    {
        get { return loginName; }
        set { loginName = value; }
    }

    public string PassWord
    {
        get { return passWord; }
        set { passWord = value; }
    }
}

Xaml:

<ListBox x:Name="CredentialList" Width="auto" Height="auto"
    Grid.Column="0" Grid.Row="2" Style="{StaticResource CredentialList}" 
    SelectionMode="Multiple" 
    ItemsSource="{Binding Source={StaticResource NameListData}}"  
    ItemTemplate="{StaticResource NameItemTemplate}"                                                  
    IsSynchronizedWithCurrentItem="True"/>

xaml дата-шаблон:

<c:NameList x:Key="NameListData"/>

    <DataTemplate x:Key="NameItemTemplate">
            <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
                <TextBlock x:Name="DomainNameForCredentials" FontSize="18"  Grid.Row="2" Grid.Column="0" Text="{Binding Path=DomaineName, Mode=TwoWay}" Style="{StaticResource CredentialListTextBlock}" ></TextBlock>
                <Label Grid.Row="1" Grid.Column="1" Content="samAccountName" Style="{StaticResource CredentialListLabel}" ></Label>
                <Label Grid.Row="1" Grid.Column="2" Content="Passwort" Style="{StaticResource CredentialListLabel}"></Label>
                <TextBox x:Name="samAccountNameForCredentials" Grid.Row="2" Grid.Column="1" Text="{Binding Path=LoginName, Mode=TwoWay}" Style="{StaticResource CredentialListTextBox}" />
                <TextBox x:Name="passwordForCredentials" Grid.Row="2" Grid.Column="2" Text="{Binding Path=PassWord, Mode=TwoWay}" Style="{StaticResource CredentialListTextBox}"/>
        </Grid>
    </DataTemplate>

и мне нужно добавить новый элемент при щелчке по списку, чтобы отобразить его в моем пользовательском интерфейсе и делать с ним другие вещи.

Я пытался добавить некоторые пустые элементы listItem, например:

var setCredentialsforAD = new NameList();
setCredentialsforAD.Add(new SetCredentialsForAD("","",""));

Как правильно решить мою проблему?

спасибо

1 Ответ

0 голосов
/ 30 января 2020

Я бы посмотрел, как использовать шаблон MVVM в вашем приложении. Я думаю, что ваш подход усложняет ситуацию. Как это сделать, выходит за рамки ответа. Я могу ответить на этот вопрос только потому, что знаком с другим вашим постом.

Как получить данные из шаблона данных WPF с помощью c#

Точка ObservableCollection является то, что он реализует INotifyPropertyChanged на Добавить / Удалить. Это означает, что при добавлении элемента пользовательский интерфейс уведомляется об этом изменении и обновляется соответствующим образом. Вы не хотите восстанавливать ObservableCollections.

На основании информации в предыдущем посте и того, что нужно сделать для выполнения sh, вам нужно будет

private void SaveDomainCredentials_OnClick(object sender, RoutedEventArgs e)
{
    if ( CredentialList.ItemsSource is NameList nameList )
    {
        nameList.Add(new SetCredentialsForAD("", "", ""));
    }
}
...