none
WPF绑定到一个全局单体的问题 RRS feed

  • 问题

  • 问题描述:
    (1)有一个类(实际是结构) 如LocalInfo(从INotifyPropertyChanged派生),里面有几个变量,同时有相应的set,get
    (2) 在程序开始的时候new一个全局的LocalInfo对象(里面赋了初值)
    (3)在一个窗体中如下声明:
     <Window.Resources>
      <CollectionViewSource 
      Source="{Binding Source={x:Static Application.Current}, Path=LocalInfo}"  
      x:Key="LocalInfoView" />
      </Window.Resources>
    (4)在窗体的一个子控件中如下绑定(XAML):
    <TextBox Grid.Column="1" Grid.ColumnSpan="2" Height="23" HorizontalAlignment="Center" Margin="22,1,29,1" Name="textBoxLocalName" VerticalAlignment="Center" Width="118" Text="{Binding Path=LocalName}"/>

    这里的LocalName是LocalInfo的一个变量的set,get方法

    折腾了一下午也没有在textBox中将 内容显示出来(而我用在窗口的xaml中定义一个变量时可以的:如在xaml中的定义资源:<my:LocalInfo x:Key="LocalInfoView" >

    我现在怀疑是不是不能用CollectionViewSource 声明绑定源,因为我这里不是集合,就一个单独的结构。

    问题的总体描述是:
    我的程序有一个配置信息,需要在一个界面中配置这些信息。


    不知道说清楚了没,有人知道吗?非常感谢
    2010年6月22日 15:45

答案

  • 可以这样写:

    <TextBox Text="{Binding Source={x:Static local:App.Current}, Path=LocalInfo.LocalName}" />

    而在Window要添加local命名空间声明,如:

    xmlns:local="clr-namespace:Gildor.Try.WPF"


    Tech Blog: http://gildor.cnblogs.com
    • 已标记为答案 LiuYunhong 2010年6月29日 14:47
    2010年6月28日 12:58

全部回复

  • 是我没说清楚还是很难?
    2010年6月23日 1:12
  • 我再把我的问题具体说一遍: 比如一个程序启动的时候启动一些已配置的信息,如 LocalInfo 代码如下: public class LocalInfo : INotifyPropertyChanged { public LocalInfo() { strLocalName = "LocalHost"; } public string LocalName { get { return strLocalName; } set { strLocalName = value; OnPropertyChanged("LocalName"); } } private string strLocalName; public event PropertyChangedEventHandler PropertyChanged; // Create the OnPropertyChanged method to raise the event protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } } 在app类中包含一个LocalInfo的对象,代码如下: public partial class App : Application { private LocalInfo gLocalInfo = new LocalInfo(); public void AppStartup(object sender, StartupEventArgs args) { LoadGloabData(); MainWindow mainWindow = new MainWindow(); mainWindow.Show(); } public LocalInfo LocalInfo { get { return this.gLocalInfo; } set { this.gLocalInfo = value; } } private void LoadGloabData() { //暂时空 } } 然后定义了一个窗体,想在xaml中引用这个全局变量(而不是定义一个新的LocalInfo的对象),在一个textBox中显示和编辑这个LocalInfo里的成员变量,这个怎么弄呢? msdn里面有一大堆例子,偏偏没有这样的做法 (倒是有引用全局list变量的例子,做法如:在Windows.Resources中添加 <CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=属性名}" x:Key="引用名" /> 在真正控件中绑定时只需要绑定到 “引用名”再定义具体的Path 了 但我的LocalInfo对象不是一个Collection,它用什么方式在这里定义进行引用呢 我尝试了: (1) <CollectionViewSource Source="{Binding Source={x:Static Application.Current}, Path=LocalInfo}" x:Key="LocalInfoView" /> (2) 代码方式绑定 绑定都成功,就是不能显示到我的textBox中 ) 有哪个知道呢,非常感谢 我放弃了使用了N年的MFC,改用WPF,刚起步,望大家帮忙
    2010年6月23日 2:12
  • 可以这样写:

    <TextBox Text="{Binding Source={x:Static local:App.Current}, Path=LocalInfo.LocalName}" />

    而在Window要添加local命名空间声明,如:

    xmlns:local="clr-namespace:Gildor.Try.WPF"


    Tech Blog: http://gildor.cnblogs.com
    • 已标记为答案 LiuYunhong 2010年6月29日 14:47
    2010年6月28日 12:58