如何将类属性绑定到数据模板生成的项目

时间:2019-05-30 17:05:03

标签: c# .net sql-server wpf

我正在尝试为我的学校项目制作一个“待办事项”应用程序。我有一个问题:我不知道如何删除由应用程序中的数据模板和数据库中的数据模板生成的项目。

我尝试通过获取选定的项目然后删除它来访问项目,但有时db中这些项目的ID与应用程序中的ID有所不同。我正在使用SQL Server,在我的数据库中,我有一个包含4列的表:ID(int,自动递增,主键),Task(varchar),Descr(varchar),Active(位)。现在,我尝试将复选框属性isChecked绑定到我应用程序中的Task类的Active。

这是我的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 :(得分:-1)

正如您在问题中提到的那样,您的代码中的ID生成存在问题。您应该创建一个方法,在该方法中传递所有必要的数据以创建任务,然后,数据库应返回新创建任务的ID。因此,在您的情况下,方法SQLTask.insertQuery(...)应该返回由数据库自动生成的id(int值)。现在,您可以将其分配给新创建的对象ToDoTask task = new ToDoTask(); task.Id = ...,然后,可以将其添加到任务列表中。如果这样做,您将具有一个有效的id值,以从数据库中删除任务。还有一件事,不支持将字段用作绑定源,因此在ToDoTask类中,如果要绑定属性,应将active字段更改为属性。

在这种情况下,只剩下...

在您的项目中,您可以使用框架和模式,这些框架和模式将向您学习更多有趣的知识并提高代码质量。因此,为了改善与数据库的协作,您可以使用ORM,例如实体框架(https://docs.microsoft.com/en-us/ef/)。要将GUI代码与业务逻辑代码分开,可以使用MVVM模式。在这里您有很多选择,例如您可以使用以下项目之一:

要了解有关MVVM的更多信息,请查看以下问题:MVVM: Tutorial from start to finish?