0

数据绑定按我的意图工作,有点......我现在遇到的真正问题是我认为是我的用户控件的 2 个不同实例,但只有我实现的原始调试列表显示。

简而言之,我正在构建 2 个在技术上绑定到数据网格的列表,我在默认构造函数中创建的默认调试列表,然后是我创建的绑定到数据网格的真实列表。

每次我单击带有数据网格的用户控件时,默认构造函数都会在我的调试列表中添加另一行并将其显示在屏幕上。

每次我单击在单独的用户控件上构建选定选项列表的按钮时,我都可以看到我的选项添加到我一直在创建的选项列表中,并在技术上将其设置为数据网格的数据上下文,相同默认调试列表的方式,除非当我单击返回到数据网格用户控件时,默认构造函数再次运行,将另一行添加到我的调试列表中,并显示正在构建的调试列表。

这是该类的副本,其中包含我添加的几行以帮助调试问题。

 public partial class QuotePreview : UserControl
{
    private SelectionList _selectionList;
    private SelectionList temp;

    public QuotePreview()
    {
        InitializeComponent();
        _selectionList = (SelectionList)this.DataContext;
    }

    private void QuotePreview_Loaded(object sender, RoutedEventArgs e)
    {

        //Adds item to Debugging list
        _selectionList.SelectedOptions.Add(
            new Selection
            {
                ModelNumber = "this",
                Description = "really",
                Price = "sucks"
            });

    }

    public QuotePreview(SelectionList selectedOptions)
    {

        InitializeComponent();
        _selectionList = (SelectionList)this.DataContext;

        temp = selectedOptions;

        //The list I am actually trying to display
        _selectionList.AddRange(selectedOptions);

        QuotePreview_Loaded();
    }

    private void QuotePreview_Loaded()
    {
        foreach (var options in temp.SelectedOptions)
        {
            _selectionList.SelectedOptions.Add(options);
        }

        QuotePreviewDataGrid.ItemsSource = _selectionList.SelectedOptions;
    }
}

每次单击用户控件/选项卡时都会调用默认构造函数的实现。发生这种情况时,_selectionList 被设置为用户控件的数据上下文,然后是 Loaded Event,它在我的数据网格中添加了一行。

在另一个用户控件中,我选择要添加到数据网格用户控件的选项,单击一个按钮,该按钮创建要添加的选项列表并调用我编写的自定义构造函数。构造函数完成后,它会调用我为狗屎和傻笑创建的自定义 Loaded Event 方法,该方法将选定的选项添加到我的 _selectionList。

现在,一旦我再次单击数据网格用户控件,它就会经历整个默认过程,并添加另一个默认行。

如果我返回一个选项卡并再次说我想要这些选项并返回数据网格,它会再次执行默认过程并添加另一个默认行。

最有趣的是我可以看到两个 selectionLists 的构建,因为我没有清除进程之间的内容。我看到了我要显示的选项的列表构建和默认选项构建的列表构建...

哦,还有,SelectionList 确实实现了 ObservableCollection

4

2 回答 2

0

我终于想出了解决问题的办法。

public static class QuotePreview
{
    public static ObservableCollection<PurchasableItem> LineItems { get; private set; }

    static QuotePreview()
    {
        LineItems = new ObservableCollection<PurchasableItem>();
    }

    public static void Add(List<PurchasableItems> selections)
    {
        foreach (var selection in selections)
        {
            LineItems.Add(selection);
        }
    }

    public static void Clear()
    {
        LineItems.Clear();
    }
}

public class QuoteTab : TabItem
{
    public ObservableCollection<PurchasableItem> PreviewItems { get; private set; }

    public QuoteTab()
    {          
        Initialize()

        PreviewItems = QuotePreview.LineItems;

        DataGrid.ItemSource = PreviewItems
    }
}
于 2013-04-09T04:39:01.190 回答
0

我不完全按照您的要求进行操作,但是只要需要加载,加载事件就会触发,并且在您在视图之间切换的情况下,TabControl 在需要之前不会呈现其内容!

 bool _isDefaultItemAdded = false
private void QuotePreview_Loaded(object sender, RoutedEventArgs e)
{
    if(!_isDefaultItemAdded)
    {
       //Adds item to Debugging list
         _selectionList.SelectedOptions.Add(
        new Selection
        {
            ModelNumber = "this",
            Description = "really",
            Price = "sucks"
        });
        _isDefaultItemAdded = true;
    }


}
于 2013-02-28T05:44:40.223 回答