WPF 如何动态绑定static成员变量 并实现INOTIFYPROPERTYCHANGED方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 如何动态绑定static成员变量 并实现INOTIFYPROPERTYCHANGED方法相关的知识,希望对你有一定的参考价值。

我想请问一下 我在类中定义了static类型的全局static变量 现在我想将它绑定oneway方式到一个textBox控件上面去,据说要动态绑定需要实现INotifyPropertyChanged方法, 请问具体该怎么去做呢?

首先创先一个实体类
public class MyClass : INotifyPropertyChanged

private static string _myString = "sdfdsfssdfsdfsdfdsf";

public string MyString

get return _myString;
set

_myString = value;
OnPropertyChanged("MyString");



public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)

PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));



//然后把这个实体类绑定到页面的 DataContext

<TextBox Text="Binding MyString"/>
追问:
我从后台绑定的,但是它说我没有实现INOtifyPropertyChanged接口

追答:
2中方式
第一种

第二种

追问:
使用第一种方法的时候它说URI指向的是未包含在程序集中的命名空间...

所以我在后台绑定的,具体代码如下:

但是程序爆出如下异常,请问该怎么办?把绑定的方法从oneway改为onetime
就可以运行,请问是什么原因:

追答:
不是这么写的吧
简单的写法

this.DataContext = new MyClass();
MytTextBox.SetBinding(TextBox.TextProperty, new Binding("MyString")Mode = BindingMode.OneWay);

你的那种写法就不需要绑定DataContext了
直接
Binding bd = new Binding() Source = new MyClass(), Path = new PropertyPath("MyString"),Mode = BindingMode.OneWay ;
BindingOperations.SetBinding(MytTextBox, TextBox.TextProperty, bd);
追问:
你好,按照你的方式试过了,还是抛出XamlParseException错误,然后我将OneWay的调用方法改为onetime就不会出错,应该还是INotiyPropertyChanged接口没有正确实现,请问我该怎么办?
参考技术A 首先创先一个实体类
public class MyClass : INotifyPropertyChanged

private static string _myString = "sdfdsfssdfsdfsdfdsf";

public string MyString

get return _myString;
set

_myString = value;
OnPropertyChanged("MyString");



public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)

PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));



//然后把这个实体类绑定到页面的 DataContext

<TextBox Text="Binding MyString"/>
参考技术B 首先创先一个实体类
public class MyClass : INotifyPropertyChanged

private static string _myString = "sdfdsfssdfsdfsdfdsf";

public string MyString

get return _myString;
set

_myString = value;
OnPropertyChanged("MyString");



public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)

PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));



//然后把这个实体类绑定到页面的 DataContext

<TextBox Text="Binding MyString"/>追问

我从后台绑定的,但是它说我没有实现INOtifyPropertyChanged接口

追答

2中方式

第一种 


第二种

追问

使用第一种方法的时候它说URI指向的是未包含在程序集中的命名空间...

所以我在后台绑定的,具体代码如下:

但是程序爆出如下异常,请问该怎么办?把绑定的方法从oneway改为onetime

就可以运行,请问是什么原因:

追答

不是这么写的吧
简单的写法

this.DataContext = new MyClass();
MytTextBox.SetBinding(TextBox.TextProperty, new Binding("MyString")Mode = BindingMode.OneWay);

你的那种写法就不需要绑定DataContext了
直接
Binding bd = new Binding() Source = new MyClass(), Path = new PropertyPath("MyString"),Mode = BindingMode.OneWay ;
BindingOperations.SetBinding(MytTextBox, TextBox.TextProperty, bd);

追问

你好,按照你的方式试过了,还是抛出XamlParseException错误,然后我将OneWay的调用方法改为onetime就不会出错,应该还是INotiyPropertyChanged接口没有正确实现,请问我该怎么办?

本回答被提问者和网友采纳

WPF 中的变量绑定

【中文标题】WPF 中的变量绑定【英文标题】:Variable Bindings in WPF 【发布时间】:2008-08-14 19:01:02 【问题描述】:

我正在为丰富的 TreeView 创建一个 UserControl(具有用于重命名节点、添加子节点等的上下文菜单)。我希望能够使用此控件来管理或导航我将创建的任何分层数据结构。我目前让它适用于实现以下接口的任何数据结构(实际上不需要实现接口,但是只需要这些成员的存在):

interface ITreeItem

    string Header  get; set; 
    IEnumerable Children  get; 

然后在我的 UserControl 中,我使用模板将我的树绑定到数据结构,如下所示:

<TextBlock x:Name="HeaderTextBlock" Text="Binding Path=Header" />

我想做的是在我的 RichTreeView 中定义每个成员的名称,使其能够适应一系列不同的数据结构,如下所示:

class MyItem

    string Name  get; set; 
    ObservableCollection<MyItem> Items;


<uc:RichTreeView ItemSource=Binding Source=StaticResource MyItemsProvider 
    HeaderProperty="Name" ChildrenProperty="Items" />

有没有办法将用户控件内的绑定路径公开为该用户控件的公共属性?有没有其他方法可以解决这个问题?

【问题讨论】:

【参考方案1】:

也许这可能会有所帮助:

在 Header 依赖属性上设置 HeaderProperty 属性时创建一个新的 Binding:

Header 属性是您日常的 DependencyProperty:

    public string Header
    
        get  return (string)GetValue(HeaderProperty); 
        set  SetValue(HeaderProperty, value); 
    

    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.Register("Header", typeof(string), typeof(ownerclass));

您的 HeaderProperty 的属性如下:

    public static readonly DependencyProperty HeaderPropertyProperty =
        DependencyProperty.Register("HeaderProperty", typeof(string), typeof(ownerclass), new PropertyMetadata(OnHeaderPropertyChanged));

    public string HeaderProperty        
    
        get  return (string)GetValue(HeaderPropertyProperty); 
        set  SetValue(HeaderPropertyProperty, value); 
    

   public static void OnHeaderPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    
        if (args.NewValue != null)
        
            ownerclass c = (ownerclass) obj;

            Binding b = new Binding();
            b.Path = new PropertyPath(args.NewValue.ToString());
            c.SetBinding(ownerclass.HeaderProperty, b);
        
    

HeaderProperty 是您日常的 DependencyProperty,带有一个在 HeaderProperty 更改时立即调用的方法。因此,当它更改时,它会在 Header 上创建一个绑定,该绑定将绑定到您在 HeaderProperty 中设置的路径。 :)

【讨论】:

以上是关于WPF 如何动态绑定static成员变量 并实现INOTIFYPROPERTYCHANGED方法的主要内容,如果未能解决你的问题,请参考以下文章

网上整理的Java面试

WPF 中的变量绑定

WPF 复选框绑定

wpf checkbox 如何绑定变量

子类继承父类怎么在父类的方法中访问子类的变量

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换