C# 使用datatemplate绑定列表框中的选定项

C# 使用datatemplate绑定列表框中的选定项,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个带有问题和答案的列表框,它从数据库中获取数据。现在我想显示或编辑“Listbox”中所选行的数据,但我无法访问此行 编辑。显示我想做什么的图像: 我的看法是: <Window x:Class="QuizMaker.MainWindow" <Window.DataContext> <local:MainViewModel /> </Window.DataContext> <Window.Resour

我有一个带有问题和答案的
列表框
,它从
数据库
中获取数据。现在我想显示或编辑“Listbox”中所选行的数据,但我无法访问此行

编辑。显示我想做什么的图像:

我的看法是:

<Window x:Class="QuizMaker.MainWindow"
    <Window.DataContext>
        <local:MainViewModel />
    </Window.DataContext>

    <Window.Resources>
        <DataTemplate x:Key="QuestionsTemplate">
            <Grid>      
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="320" />
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="20" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Path=Question}" FontWeight="Bold" />
                <TextBlock Grid.Column="1" Text="{Binding Path=AnswerA}" />
                <TextBlock Grid.Column="2" Text="{Binding Path=AnswerB}"/>
                <TextBlock Grid.Column="3" Text="{Binding Path=AnswerC}"/>
                <TextBlock Grid.Column="4" Text="{Binding Path=AnswerD}"/>
                <TextBlock Grid.Column="5" Text="{Binding Path=RightAnswer}" FontWeight="Bold"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>

    <Grid>        
        <ListBox  DataContext="{Binding MyDataSet}" 
                  x:Name="listBox"   
                  ItemsSource="{Binding Path=QuestionTable}"
                  ItemTemplate="{StaticResource QuestionsTemplate}" 
                  SelectedItem="{Binding SelectedItemString}"             
        />

    </Grid>
</Window>

很抱歉,我无法添加评论。我希望您的要求是在文本框中显示所选项目的值,并在更改文本框中的值时将相同的值更新到您的集合(在您的数据表中)。如果这是您的需求,请像这样更改文本框绑定

<TextBox x:Name="ValueText" Text="{Binding SelectedItem.ColumnName, ElementName=listBox, UpdateSourceTrigger=PropertyChanged}" />


我不知道为什么要将SelectedItem绑定到字符串类型SelectedItemString属性。它将根据您的源创建绑定错误。

将您的
SelectedItemString
属性更改为
DataRow
,并将其他控件绑定到该属性

比如说,

public DataRow SelectedItem
{
    get
    {
        return _MainModel.SelectedItem;
    }
    set
    {
        _MainModel.SelectedItem = value;
        OnPropertyChanged("SelectedItem");
    }
}
在XAML中应该是这样的:

<Window x:Class="QuizMaker.MainWindow"
    <Window.DataContext>
        <local:MainViewModel />
    </Window.DataContext>

    <Window.Resources>
        <DataTemplate x:Key="QuestionsTemplate">
            <Grid>      
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="320" />
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="20" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Path=Question}" FontWeight="Bold" />
                <TextBlock Grid.Column="1" Text="{Binding Path=AnswerA}" />
                <TextBlock Grid.Column="2" Text="{Binding Path=AnswerB}"/>
                <TextBlock Grid.Column="3" Text="{Binding Path=AnswerC}"/>
                <TextBlock Grid.Column="4" Text="{Binding Path=AnswerD}"/>
                <TextBlock Grid.Column="5" Text="{Binding Path=RightAnswer}" FontWeight="Bold"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>

    <DockPanel>   
        <ContentControl Content="{Binding SelectedItem}" 
                        ContentTemplate="{StaticResource QuestionsTemplate}" 
                        DockPanel.Dock="Top" />  

        <ListBox  DataContext="{Binding MyDataSet}" 
                  x:Name="listBox"   
                  ItemsSource="{Binding Path=QuestionTable}"
                  ItemTemplate="{StaticResource QuestionsTemplate}" 
                  SelectedItem="{Binding SelectedItem}"             
        />

    </DockPanel>
</Window>

你到底在问什么?如何从数据库中获取数据?这可能与主题无关,但在您的
AddToDB()
方法中,您似乎有一个复制/粘贴错误,您将
@Question
参数设置了五次,而其他四个参数则根本没有设置。可能是重复的否,我从数据库中获取数据,并且它在列表框中显示良好。现在我想点击listbox中的一行,然后我想编辑(将每个字段复制到textbox或其他内容)或删除选中的行。
<Window x:Class="QuizMaker.MainWindow"
    <Window.DataContext>
        <local:MainViewModel />
    </Window.DataContext>

    <Window.Resources>
        <DataTemplate x:Key="QuestionsTemplate">
            <Grid>      
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="320" />
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="20" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Path=Question}" FontWeight="Bold" />
                <TextBlock Grid.Column="1" Text="{Binding Path=AnswerA}" />
                <TextBlock Grid.Column="2" Text="{Binding Path=AnswerB}"/>
                <TextBlock Grid.Column="3" Text="{Binding Path=AnswerC}"/>
                <TextBlock Grid.Column="4" Text="{Binding Path=AnswerD}"/>
                <TextBlock Grid.Column="5" Text="{Binding Path=RightAnswer}" FontWeight="Bold"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>

    <DockPanel>   
        <ContentControl Content="{Binding SelectedItem}" 
                        ContentTemplate="{StaticResource QuestionsTemplate}" 
                        DockPanel.Dock="Top" />  

        <ListBox  DataContext="{Binding MyDataSet}" 
                  x:Name="listBox"   
                  ItemsSource="{Binding Path=QuestionTable}"
                  ItemTemplate="{StaticResource QuestionsTemplate}" 
                  SelectedItem="{Binding SelectedItem}"             
        />

    </DockPanel>
</Window>
<ContentControl Content="{Binding ElementName=listBox, Path=SelectedItem}" 
                ContentTemplate="{StaticResource QuestionsTemplate}" 
                DockPanel.Dock="Top" />