从DataTemplate中的DataGrid绑定到字符串的ObservableCollection

时间:2016-03-08 09:06:40

标签: c# wpf xaml datagrid

所以我有一个WPF c#项目,在usercontrol中,我有一个列表,它通过DataTemplateSelector设置集合的显示。那些包含一些简单字符串和整数的数据绑定对象,以及一个名为Answers的可观察字符串集合。我已经使用所需的PropertyChangedEventHandler和函数在对象中实现了INotifyPropertyChanged。

所以,下面是生活在datatempate中的xaml片段,调用它来显示listItem

<DataGrid x:Name="AnswersListBox" HorizontalAlignment="Stretch" Grid.Column="3" Grid.Row="3" Grid.ColumnSpan="2" ItemsSource="{Binding Answers}"
  AutoGenerateColumns="False" Margin="10,10,10,10" CanUserResizeRows="False"  >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=DataContext, 
             RelativeSource={RelativeSource Self}, Mode=TwoWay}" Header="Possible Answers"
             Width="130" IsReadOnly="False" CanUserResize="False" CanUserSort="False" CanUserReorder="False" MaxWidth="130"/>
    </DataGrid.Columns>
</DataGrid>

图像显示工作数据绑定对象

enter image description here

我的问题是,显示答案的数据网格(目前在其中重复了一个单词)不会更新...... 香港专业教育学院为可编辑的列表视图和带有文本框的列表框尝试了很多变体,但是这个数据网格是最接近的,但它不会在观察者收集中保留一个编辑的值

编辑以添加更多代码

继承人ObservrableCollection

namespace CRUDeBuilder.chunkProtos
{
public class MultiChoice : Question
{
    /// <summary>
    /// this is a type of question that holds a statement and several answers
    /// </summary>

    private ObservableCollection<string> answers = new ObservableCollection<string>();
    private int correctAnswer = 0;
    private bool randomise = false;

    public MultiChoice()
    {
        base.QuestionType = "multiChoice";
    }


    public ObservableCollection<string> Answers
    {
        get
        {
            return answers;
        }
        set
        {
            answers = value;
            base.NotifyPropertyChanged("Answers");

        }

    }
// ive just chopped off bits here

INotifyPropertyChanged的实现在Multichoice的基类中:问题并且是

public abstract class Question : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

}

后面的代码将项添加到答案observablecollection

private void addAnswerBtn_Click(object sender, RoutedEventArgs e)
    {
        Button button = sender as Button;
        Question question = button.DataContext as Question;


        //Console.WriteLine("clicking add answer button");
        if (question is MultiChoice)
        {
            Console.WriteLine("is a multichoice ");
            ((MultiChoice)question).addAnswer("a word");
            //((MultiChoice)question).Answers.Add("a word");
            // both of these add, but I added the custom version to check
        }
        else
        {
            Console.WriteLine("is NOT a multichoice");
        }

    }

我无法看到我错过了将这些编辑过的答案设置为数据

1 个答案:

答案 0 :(得分:0)

所以,经过几个月的使用WPF c#(WPF的总开发时间是4个月),我终于通过将这些设计的大型笨拙的xaml部分解压缩到他们自己独立的UserControl中来解决这个问题。这使得UserControl可以在设计时以可视方式设计,而不是像xaml数据模板那样仅使用运行时xaml,现在是用户控件作为数据模板。以前,我不知道如何将所有这些控件堆叠在一起。

我会把这个留在这里作为这个非常令人沮丧的问题的实际答案。主要是因为我缺乏使用C#wpf的词汇。

可观察的集合不会触发项目的项目修改,除非这些项目可以通过属性访问...

05-06 01:36:50.118 5272-5272/com.sebb.vilify D/test fragment onCreateView: 0
05-06 01:36:50.817 5272-5272/com.sebb.vilify D/test fragment setSongsList: 7
05-06 01:36:50.817 5272-5272/com.sebb.vilify D/test arraylist in activity: 7

bash: alias: `c d..': invalid alias name