【问题标题】:WPF label content databindingWPF 标签内容数据绑定
【发布时间】:2010-11-02 12:40:47
【问题描述】:

我在 WPF4 中有一个标签,并试图将内容绑定到来自 c# 类的值。我创建了一个 ObjectDataProvider,但由于某种原因看不到内容或更新。你能指出我做错了什么吗?

这里是 xaml -

<Grid.Resources>
<local:SummaryData x:Key="mySummaryData"/> </Grid.Resources>
<Label Name ="lbCurrentVerValue" Grid.Row="1" Grid.Column="2" Content="{Binding Path=frameworkVersion, Source={StaticResource mySummaryData}}"/>
<TextBox Name ="lbFromVerValue" Grid.Row="2" Grid.Column="2" Text="{Binding Source={StaticResource mySummaryData}, Path=frameworkVersion}"/>

这里是c#代码-

namespace DBUpgradeUI

{

public partial class DBUpgReadinessCheck : Window
{
    public string userConnStr = String.Empty;
    public string userFoldPath = String.Empty;
    public SummaryData sd = new SummaryData();

    public DBUpgReadinessCheck()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ReadinessCheck(userConnStr, userFoldPath);
    }

    public void ReadinessCheck(string connectionString, string folderPath)
    {
        FrmImportUtility frmWork = new FrmImportUtility();
        sd.frameworkVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); ;
        frmWork.CurrentlyProcessingVersion(connectionString, folderPath, ref sd.currentVersion, ref sd.finalVersion);
    }
}
public class SummaryData
{
    public string currentVersion = "Test";
    public string finalVersion = "finalVerTest";
    public string frameworkVersion = String.Empty;
}

}

【问题讨论】:

  • 代码太多,你能用更小的示例程序重现这个问题吗?
  • IIRC 绑定到internal 成员不起作用,因为 XAML 的编译方式。您可以尝试将这些成员设为公开,看看是否会有所改变?
  • Kugel,刚刚对 xaml 进行了编辑以显示相关代码
  • Dan,我不知道,让我尝试更改为 public 看看是否有变化 - 谢谢
  • 丹,将它们公开,但仍然不行!

标签: wpf-controls binding


【解决方案1】:

您必须在 SummaryData 中实现 INotifyPropertyChanged:

public class SummaryData:INotifyPropertyChanged
{
  private string currentVersion = "Test";

  public string CurrentVersion
  {
    get { return currentVersion; }
    set { 
          currentVersion = value; 
          NotifyChanged("CurrentVersion"); 
        }
  }

  private void NotifyChanged(string p)
  {
    if (PropertyChanged != null)
    {
      PropertyChanged(this,
            new PropertyChangedEventArgs(property));
    }
  }

  #region INotifyPropertyChanged Members

  public event PropertyChangedEventHandler PropertyChanged;

  #endregion
}

【讨论】:

  • 试过了,但是当值为“Test”时,即使是第一次也不显示该值
  • 尝试公开属性,而不是内部
  • 另外,请确保绑定到属性(CurrentVersion),而不是成员(currentVersion)
【解决方案2】:

在尝试了在没有依赖属性且没有运气的情况下从类对象绑定属性的方法之后,我完成了以下操作,它就像一个魅力!

xaml -

  <Label Name ="lbCurrentVerValue" Grid.Row="1" Grid.Column="2" Content="{Binding Mode=OneWay, ElementName=step2Window,Path=currentVersion}"/>
  <Label Name ="lbFromVerValue" Grid.Row="2" Grid.Column="2" Content="{Binding Mode=OneWay, ElementName=step2Window,Path=finalVersion}"/>

和c#代码——

 public partial class DBUpgReadinessCheck : Window
{
    //Values being passed by step1 window
    public string userConnStr = String.Empty;
    public string userFoldPath = String.Empty;

    //Dependency properties
    public string currentVersion
    {
        get { return (String)this.GetValue(CurVersionProperty); }
        set { this.SetValue(CurVersionProperty, value); }
    }
    public static readonly DependencyProperty CurVersionProperty =
           DependencyProperty.Register("currentVersion", typeof(String), typeof(DBUpgReadinessCheck), new UIPropertyMetadata("0"));


    public String finalVersion
    {
        get { return (String)GetValue(FinVerProperty); }
        set { SetValue(FinVerProperty, value); }
    }
    public static readonly DependencyProperty FinVerProperty =
        DependencyProperty.Register("finalVersion", typeof(String), typeof(DBUpgReadinessCheck), new UIPropertyMetadata("0"));

    public string frameworkVersion
    {
        get { return (String)GetValue(FrameWrkVersionProperty); }
        set { SetValue(FrameWrkVersionProperty, value); }
    }
    public static readonly DependencyProperty FrameWrkVersionProperty =
        DependencyProperty.Register("frameworkVersion", typeof(String), typeof(DBUpgReadinessCheck), new UIPropertyMetadata("0"));

    public DBUpgReadinessCheck()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ReadinessCheck(userConnStr, userFoldPath);
    }

    public void ReadinessCheck(string connectionString, string folderPath)
    {
        FrmImportUtility frmWork = new FrmImportUtility();
        frameworkVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
        string tempCurVersion = string.Empty;
        String tempFinalVersion = string.Empty;
        frmWork.CurrentlyProcessingVersion(connectionString, folderPath, ref tempCurVersion, ref tempFinalVersion);
        currentVersion = tempCurVersion;
        finalVersion = tempFinalVersion;

        //Validation
        if (finalVersion == frameworkVersion)
        {
            string strUri2 = String.Format(@"pack://application:,,,/GreenCheck.jpg");
            ImgFrmVersion.Source = new BitmapImage(new Uri(strUri2));
            yelloExclamation.Visibility = System.Windows.Visibility.Hidden;
            errMsg.Visibility = System.Windows.Visibility.Hidden;
            succMsg.Visibility = System.Windows.Visibility.Visible;
            btRecheckSetUp.Visibility = System.Windows.Visibility.Hidden;
            btStartUpgrade.IsEnabled = true;
        }
    }

这很好用。感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多