【问题标题】:string bound to TextBlock in ComboBox doesn't show up绑定到 ComboBox 中 TextBlock 的字符串不显示
【发布时间】:2016-07-15 16:52:54
【问题描述】:

我在 C# WPF 项目的 ComboBox 中有一个 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;
    }
}

【问题讨论】:

    标签: c# wpf data-binding combobox textblock


    【解决方案1】:

    DataBinding 时,只能绑定到属性。此外,您需要使用PropertyChangedEvent 更新您的属性。否则,如果您在初始绑定后更改属性,它不会更新 UI。

    你需要使用 on property changed and a property

      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。相反,您想设置 View 的 DataContext 属性,然后绑定到您的 ItemsSource

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

    【讨论】:

      【解决方案2】:

      Name是一个字段,你只能绑定到properties

      【讨论】:

        猜你喜欢
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 2021-09-05
        相关资源
        最近更新 更多