WPF 如何从后台获取ContentPresenter

WPF 如何从后台获取ContentPresenter,第1张

如果你说的后台的意思是cs文件的活,你可以在cs中取出你要绑定的静态资源的对象,然后将那个对象设置到ContentTemplate中。

cs中用代码设置ContentTemplate时不能象xaml那样只设置字符串。

因为在xaml中你设置的字符串会在编译时被VS翻译成对应的代码。做了一些幕后的工作。你要在cs中绑定的时候,要做与VS相同的实例化和绑定工作。

listbox是显示数据集合的,为何你第三个listbox是用来显示单个元素的 。。。

如果你在后台有个类,比如Student。里面有个Name属性。第二个listbox绑定Student对象集合

class Student

{

public string Name { get; set; }

}

List<Student> Students = new List<Student>();

StudentsAdd(new Student() { Name = "aaa" });

StudentsAdd(new Student() { Name = "bbb" });

StudentsAdd(new Student() { Name = "ccc" });

listboxItemsSource = Students;

前台代码:

<StackPanel Width="200">

<ListBox x:Name="listbox" SelectedValuePath="Name" DisplayMemberPath="Name"/>

<TextBlock x:Name="txtName" Text="{Binding ElementName=listbox, Path=SelectedValue}" />

</StackPanel>

显示单个对象(第二个listbox的选中对象)的值用一个textblock就可以了么。直接将listbox的SelectedValue绑定到text属性上不就完事了。

可以把任何一个CLR对象绑定为DependencyProperty。在VS2010下输入propdp,按Tab,会生成一个模板public int MyProperty{get { return (int)GetValue(MyPropertyProperty); }

set { SetValue(MyPropertyProperty, value); }}// Using a DependencyProperty as the backing store for MyProperty This enables animation, styling, binding, etc public static readonly DependencyProperty MyPropertyProperty =

DependencyPropertyRegister("MyProperty", typeof(int), typeof(ownerclass), new UIPropertyMetadata(0)); MyProperty就是你要绑定的成员,修改它之后按Tab,后面的自动都会改变,如:public string Test{get { return (string)GetValue(TestProperty); }

set { SetValue(TestProperty, value); }}// Using a DependencyProperty as the backing store for Test This enables animation, styling, binding, etc public static readonly DependencyProperty TestProperty =

DependencyPropertyRegister("Test", typeof(string), typeof(ownerclass), new UIPropertyMetadata(0)); 这里的ownerclass是拥有此成员的类名(如:class ownerclass {//})。最后一个参数VS自动生成的有问题,因为它放入了一个参数0。实际上应该是UIPropertyMetadata(Object, PropertyChangedCallback, CoerceValueCallback, Boolean),用于设置UI中的数据更改后回调的函数。一般删除之或者用默认构造函数就行。如果需要它,一个简单的定义如下:public static readonly DependencyProperty IsNetworkChangedProperty =

DependencyPropertyRegister("IsNetworkChanged", typeof(bool), typeof(MainWindow),

new UIPropertyMetadata(false, new PropertyChangedCallback(MainWindowOnIsNetworkChanged)));

private static void OnIsNetworkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){//MessageBoxShow(dGetType()ToString()); } 注意这里是静态函数,由DependencyObject d来得到具体的通知对象。 然后在控件中进行绑定,如,对Test变量的使用一如普通变量。 注意:①使用DependencyProperty比INotifyPropertyChanged的方法性能要高。因为它用Hash实现,不需要反射,而且是WPF系统中相当底层的一个基类 ②DependencyObjects are not marked as serializable ③The DependencyObject class overrides and seals the Equals() and GetHashCode() methods ④A DependencyObject has thread affinity – it can only be accessed on the thread on which it was created。(这一点很重要,特别是当程序中用到注册事件时,因为这些往往要开新线程。比如我的这个软件中,将bool型IsNetworkAvailabe用DependencyProperty绑定到控件,然后注册事件NetworkAvailabilityChanged,在NetworkAvailabilityChangedEventHandler中更新IsNetworkAvailabe值,这样就会抛出异常) 在需要多线程 中 *** 作的绑定变量,则需要用INotifyPropertyChanged 再看如何用INotifyPropertyChanged: 这里要将待绑定的变量包装在一个类中:class MyTest : INotifyPropertyChanged{private string test;

public string Test{get { return thistest; }set {if (thistest != value){thistest = value;

thisNotifyPropertyChanged("Test");}}}public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(info));}}} 其中test就是我们要绑定的变量。(绑定一个变量写这么多一堆,有点不值,我另开一篇,做一个snippet模板,用来快速生成)。 绑定时不知为何上面的绑定方法不灵了,于是换成代码绑定吧:MyTest Test;

public MainWindow(){InitializeComponent();

thisTest = new MyTest();

Testtest = "thy";

TestBoxDataContext = thisTest;

} 最终,在我的应用场景中,这两者都没能有用,我注册了事件NetworkAvailabilityChanged,在其中去修改一个绑定到 ListBox的ObservableCollection,让其实现UI自动更新。但是总是会引起异常,我想可能是跨线程的原因吧。于是我试 着用DependencyProperty绑定一个变量,在NetworkAvailabilityChanged事件中修改,还是不行, INotifyPropertyChanged也一样,BackgroundWorker也不行。最终没辙,在MainWindow中开了一个DispatcherTimer来轮 询一个普通的bool变量:private DispatcherTimer _timer = new DispatcherTimer(DispatcherPriorityContextIdle);

_timerInterval = TimeSpanFromMilliseconds(100);

_timerStart(); 虽说比较丑,但没法子啊,没这么多精力再去整了,先让它工作起来吧。

我有一点疑问想咨询下楼主。绑定的path是用来设置绑定对象的“属性”的。如当一个textbox用来显示后台Student类的studentName的话,就写成 <TextBox x:Name="tb" Text="{Binding Path=studentName}"/>我不明白的是 path=DesiredSize/Height 这是个啥玩意?属性名怎么可以参与计算 *** 作。。。

以上就是关于WPF 如何从后台获取ContentPresenter全部的内容,包括:WPF 如何从后台获取ContentPresenter、请问WPF如何将多个Listbox数据绑定到一个Listbox上、WPF新手之将如何将一个成员变量或自定义类绑定到控件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9630166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存