Xaml绑定逻辑错误

时间:2015-01-02 09:59:30

标签: c# wpf xaml binding

我正在尝试将obeservablecollection内容从名为LumelauaPikkused的属性绑定到xaml组合框。我正在设置datacontext,但是对于某些共鸣,如果我向LumelauaPikkused添加项目,它会显示任何内容

<ComboBox x:Name="VLumelaud"
                HorizontalAlignment="Left"
                VerticalAlignment="Top" Width="120" 
                Canvas.Left="10" 
                Canvas.Top="200" 
                Cursor="Hand"
                ItemsSource="{Binding Lumelauapikkused}"                          
             >
                <ComboBox.DataContext>
                    <modelsView:LumelauaPikkused/>
                </ComboBox.DataContext>
            </ComboBox>



  using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Laenutus.ModelsView
{
    public class LumelauaPikkused
    {
        public ObservableCollection<string> _lumelauaPikkused;

        public LumelauaPikkused() 
        {
            this._lumelauaPikkused = new ObservableCollection<string>();
        }

        public ObservableCollection<string> Lumelauapikkused
        {
            get { return _lumelauaPikkused; }
            set { _lumelauaPikkused = value; }
        }


    }
}

 private void LisaVarustusClick(object sender, RoutedEventArgs e)
    {
        #region LisaLumeLaud


        #endregion

         #region CheckIfTextBoxHasValue
         ///// ADDING LOGIC ////////////
           if (!String.IsNullOrEmpty(_LisaMaesuusk.Text))
             {
                  String lisaLumel = _LisaLumelaud.Text;
                  lpp.Lumelauapikkused.Add(lisaLumel);
                  LumelauaPikkused.Add(lisaLumel);
                  Console.WriteLine(" mitu lumelauda " + lpp.Lumelauapikkused.Count);

                 _LisaMaesuusk.Clear();
                  this.DataContext = MSP;
             }

             else if (!String.IsNullOrEmpty(_LisaLumelaud.Text))
             {

                 String lisaSuusk = _LisaMaesuusk.Text;
                 MSP.Maesuusapikkused.Add(lisaSuusk);

                 MaeSuusapikkused.Add(lisaSuusk);
                 Console.WriteLine(" mitu maesuuska " + MSP.Maesuusapikkused.Count);

                 _LisaLumelaud.Clear();
               //  this.DataContext = lpp;
             }
             else if (!String.IsNullOrEmpty(_LisaLumelaud.Text) || !string.IsNullOrEmpty(_LisaMaesuusk.Text))
             {
                 MessageBox.Show("Objekt on lisatud!");
             }
             else
             {
                 MessageBox.Show("Sisestage vähemalt üks väärtus");
             }


        #endregion

        // Console.WriteLine("Lumelaudu on: "  + LumelauaPikkused.ToString());

    }

//在这里我创造了这些课程的对象

public partial class MainWindow : Window
    {
        private LumelauaPikkused lpp;
        private Maesuuusapikkused MSP; //MSP = MaeSuusaPikkused
        public static List<string> LumelauaPikkused = new List<string>();
        public static List<string> MaeSuusapikkused = new List<string>();

        public MainWindow()
        {
            InitializeComponent();
            lpp = new LumelauaPikkused();
            MSP = new Maesuuusapikkused();

        }

1 个答案:

答案 0 :(得分:0)

请检查代码中的姓名。

实际上,您正在插入名为LumelauaPikkused的对象作为ComboBox DataContext,但您的类名为Maesuuusapikkused。 此外,您将ComboBox属性ItemsSource绑定到名为Lumelauapikkused的DataContext的属性,但您的类只有一个名为Maesuusapikkused的属性

修改

我尝试将一些项添加到ObservableCollection中,但我没有发现任何问题。 我用了这段代码:

public class LumelauaPikkused
{
    private ObservableCollection<string> _lumelauaPikkused;
    private System.Windows.Threading.DispatcherTimer _dispatcherTimer;

    public LumelauaPikkused()
    {
        this._lumelauaPikkused = new ObservableCollection<string>();
        this._lumelauaPikkused.Add("One");
        this._lumelauaPikkused.Add("Two");
        this._lumelauaPikkused.Add("Three");

        _dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
        _dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        _dispatcherTimer.Interval = new TimeSpan(0, 0, 20);
        _dispatcherTimer.Start();
    }

    void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        this._lumelauaPikkused.Add("Four");
        this._lumelauaPikkused.Add("Five");
        this._lumelauaPikkused.Add("Six");

        _dispatcherTimer.Stop();
    }

    public ObservableCollection<string> Lumelauapikkused
    {
        get { return _lumelauaPikkused; }
        set { _lumelauaPikkused = value; }
    }
}

我添加了一个DispatcherTimer只是为了在一段时间后添加一些元素(可能在您的代码中,您正在使用Command来添加它们)。正如您在20秒后看到的那样,ComboBox有6个项目而不是3个。

第二次编辑

为了解决您的问题,首先您必须决定要使用哪种设计架构。在您的代码中,您使用了MVVM pattern和代码隐藏模式的混合。 第一个(我更喜欢的那个)稍微复杂一点,但是让你以更简单的方式测试代码(因为它将UI与业务逻辑类分离)。 如果您想使用此技术,您应该了解command pattern

另一方面,如果您对MVVM没有信心,可以在MainWindow类中使用代码隐藏:

public partial class MainWindow : Window
{
    private LumelauaPikkused lpp;
    private Maesuuusapikkused MSP; //MSP = MaeSuusaPikkused
    public static List<string> LumelauaPikkused = new List<string>();
    public static List<string> MaeSuusapikkused = new List<string>();

    public MainWindow()
    {
        InitializeComponent();
        lpp = new LumelauaPikkused();
        MSP = new Maesuuusapikkused();
        VLumelaud.ItemsSource = lpp.Lumelauapikkused;
    }
    // the rest of your code...
}

同时您必须从XAML <modelsView:LumelauaPikkused/>和ComboBox ItemsSource绑定中删除。

无论如何,最重要的是你不能混合MVVM和“codebehind”。 我希望它有所帮助。