Как связать атрибут класса с созданным шаблоном данных - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь сделать небольшое приложение To-Do для моего школьного проекта. У меня есть одна проблема: я не знаю, как удалить элементы, сгенерированные шаблоном данных в приложении и элементы в базе данных.

Я пытался получить доступ к элементам, получив выбранный элемент и затем удалив его, но в какой-то момент идентификаторы этих элементов в БД отличаются от идентификаторов в приложении. Я использую сервер SQL, и в моей БД у меня есть одна таблица с 4 столбцами: ID (int, автоинкрементный, первичный ключ), Task (varchar), Descr (varchar), Active (бит). Теперь я пытаюсь привязать атрибут флажка isChecked к классу Active of Task в моем приложении.

это мой код xaml

<Window x:Class="ToDoApp2.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:ToDoApp2"
    mc:Ignorable="d"
    Title="MainWindow" Height="600" Width="400" ResizeMode="NoResize">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="244*"/>
        <ColumnDefinition Width="149*"/>
    </Grid.ColumnDefinitions>
    <TreeView x:Name="TrvMenu" HorizontalAlignment="Left" Height="400" VerticalAlignment="Top" Width="392" Grid.ColumnSpan="2">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:ToDoTask}" ItemsSource="{Binding Tasks}">
                <StackPanel Orientation="Horizontal">
                    <CheckBox Content="{Binding Title}" IsChecked="{Binding active}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
    <TextBox x:Name="TaskTb" HorizontalAlignment="Left" Height="30" Margin="0,400,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="392" Grid.ColumnSpan="2"/>
    <TextBox x:Name="DescriptionTb" HorizontalAlignment="Left" Height="80" Margin="0,430,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="392" Grid.ColumnSpan="2"/>
    <Button  x:Name="CreateBtn" Content="Create New Task" HorizontalAlignment="Left" Margin="0,510,0,0" VerticalAlignment="Top" Width="197" Height="59" Click="Button_Click"/>
    <Button  x:Name="DeleteBtn" Content="Delete Selected Task" HorizontalAlignment="Left" Margin="197,510,-1,0" VerticalAlignment="Top" Width="196" Height="59" Click="DeleteBtn_Click" Grid.ColumnSpan="2"/>

</Grid>
</Window>

это класс, представляющий одну задачу в приложении

public class ToDoTask
{

    public ToDoTask()
    {
        this.Tasks = new ObservableCollection<ToDoTask>();
    }
    public string Title { get; set; }
    public bool active=true;

    public ObservableCollection<ToDoTask> Tasks { get; set; }
    }

И вот как я добавляю новые задачи в базу данных и приложение

public MainWindow()
    {

        InitializeComponent();
        SQLCnn init = new SQLCnn();
        ObservableCollection<ToDoTask> initList = init.readQuery();
        for(int i=0; i < initList.Count; i++)
        {
            TrvMenu.Items.Add(initList[i]);
        }
        SQLCnn.connection.Close();

    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (!String.IsNullOrEmpty(TaskTb.Text))
        {
            string value = TaskTb.Text;
            string desc = DescriptionTb.Text;

            ToDoTask task = new ToDoTask() { Title = value };
            task.Tasks.Add(new ToDoTask() { Title = desc });
            SQLCnn SQLtask = new SQLCnn();
            SQLtask.insertQuery(value, desc);
            TrvMenu.Items.Add(task);
        }
    }
  }

1 Ответ

0 голосов
/ 30 мая 2019

Как вы упомянули в своем вопросе, у вас есть проблема с генерацией идентификатора в вашем коде.Вы должны создать метод, в котором вы передаете все необходимые данные для создания вашей задачи, и после этого ваша база данных должна вернуть вам обратно идентификатор вновь созданной задачи.Таким образом, в вашем случае метод SQLTask.insertQuery(...) должен возвращать id (int value), который автоматически генерируется вашей базой данных.Теперь вы можете назначить его только что созданному объекту ToDoTask task = new ToDoTask(); task.Id = ... и после этого добавить его в список задач.Если вы сделаете это, у вас будет действительное значение идентификатора, чтобы удалить задачу из базы данных.И еще одна вещь, поля не поддерживаются в качестве источника привязки, поэтому в классе ToDoTask вы должны изменить поле active на свойство, если вы хотите связать его.

В этом случае это все, кроме...

В вашем проекте вы можете использовать фреймворки и шаблоны, которые научат вас гораздо более интересным вещам и повысят качество вашего кода.Таким образом, для улучшения работы с базой данных вы можете использовать ORM, например, Entity Framework (https://docs.microsoft.com/en-us/ef/).). Чтобы отделить код GUI от кода бизнес-логики, вы можете использовать шаблон MVVM. Здесь у вас есть много вариантов, например, вы можете использовать один из них.из следующих проектов:

Чтобы узнать больше о MVVM, посмотрите на этот вопрос: MVVM: учебное пособие от начала до конца?

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