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" />