ComboBox中绑定到TextBlock的字符串不会显示

时间:2016-07-15 16:52:55

标签: c# wpf data-binding combobox textblock

我在C#WPF项目的ComboBox中有一个TextBlock,该项目绑定到一个' Envelope'项目,有一个字符串'名称'和一个双倍的重量'属性,我希望在TextBlock中看到前者。

当我运行程序时,ComboBox显示时没有任何文本。它正确地有三个未标记的项目,如果我查看ComboBox的ItemsSource或SelectedItem它们显示适当的值,并且与ComboBox的SelectedItem交互的其他代码行为正常。唯一不起作用的是TextBlock不包含文本。如果我用"{Binding Name}"替换"au ghdfjlnvgmumar",那么ComboBox中会出现相应的乱码,所以它肯定是绑定的问题。问题是什么,我该如何解决它?

相关代码:

XAML:

<ComboBox Name="EnvelopeList" HorizontalAlignment="Center" Width="200" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                 <TextBlock Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

C#:

//main window code
public MainWindow()
{
    InitializeComponent();

    envelopes = new List<Envelope>();
    envelopes.Add(new Envelope("TEST", 0));
    envelopes.Add(new Envelope("HI", 10));

    EnvelopeList.ItemsSource = envelopes;
}

//Envelope class
class Envelope
{
    public string Name;
    public double Weight;

    public Envelope()
    {
        Name = "[None]";
        Weight = 0;
    }
    public Envelope(string n, double w)
    {
        Name = n;
        Weight = w;
    }

    public override string ToString()
    {
        return Name;
    }
}

2 个答案:

答案 0 :(得分:3)

DataBinding时,您只能绑定到属性。此外,您需要使用PropertyChangedEvent更新您的媒体资源。否则,如果您在初始绑定后更改了属性,则无法更新UI。

您需要在属性更改和属性

上使用
  public class Envelope: ModelBase 
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name= value; OnPropertyChanged("Name"); }
        }

    }

    public class ModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propName));
            }
        }
    }

最后,我注意到您直接设置ItemsSource。相反,您要设置自己的DataContext属性,然后绑定到ItemsSource

这是MSDN article on DataBinding,它将教你如何正确地做到这一点。

答案 1 :(得分:0)

Name字段,您只能绑定到properties