Wpf ViewModel中是否有依赖项属性的示例?
是否有人可以给出WPF中ViewModel中作为datacontext传递给view的依赖项属性的示例。这是否需要从DependencyObject继承? 假设我希望ListBox SelectedItem绑定到ViewModel中的依赖项属性CurrentItem。我让它从窗口对象工作,但同样的事情不与ViewModel工作。在ViewModel中,我使用GetProperty和SetProperty,而不是CLR属性Wpf ViewModel中是否有依赖项属性的示例?,wpf,properties,dependencies,Wpf,Properties,Dependencies,是否有人可以给出WPF中ViewModel中作为datacontext传递给view的依赖项属性的示例。这是否需要从DependencyObject继承? 假设我希望ListBox SelectedItem绑定到ViewModel中的依赖项属性CurrentItem。我让它从窗口对象工作,但同样的事情不与ViewModel工作。在ViewModel中,我使用GetProperty和SetProperty,而不是CLR属性 public partial class Window1 : Window
public partial class Window1 : Window
{
ObservableCollection<Person> persons;
public ObservableCollection<Person> Persons
{
get
{
return persons;
}
set
{
persons = value;
}
}
public static readonly DependencyProperty InfoTextProperty =
DependencyProperty.Register(
"InfoText",
typeof(Person),
typeof(Window1),
new FrameworkPropertyMetadata(
new PropertyChangedCallback(ChangeText)));
public Window1()
{
InitializeComponent();
this.DataContext = this;
List<Person> people = new List<Person>();
people.Add(new Person("Makeda Wilde"));
people.Add(new Person(" Rosamaria Becnel"));
people.Add(new Person("Jarrett Bernstein"));
people.Add(new Person(" Leopoldo Palmer"));
people.Add(new Person("Tyron Fisher"));
people.Add(new Person(" Elba Kilpatrick"));
people.Add(new Person("Ivory Lavender"));
persons = new ObservableCollection<Person>(people);
//persons.CollectionChanged +=
// new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
// persons_CollectionChanged);
}
void persons_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
}
public ListBoxItem InfoText
{
get
{
return (ListBoxItem)GetValue(InfoTextProperty);
}
set
{
SetValue(InfoTextProperty, value);
}
}
private static void ChangeText(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
Person newPerson = (Person)e.NewValue;
newPerson.IsSelected = true;
Person oldPerson = (Person)e.OldValue;
if (oldPerson != null)
{
oldPerson.IsSelected = false;
}
}
// #region INotifyPropertyChanged Members
// 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));
// }
//}
// #endregion
}
public class Person : INotifyPropertyChanged
{
private bool isselected = false;
public Person(string name)
{
this.Name = name;
this.IsSelected = false;
}
public string Name { get; set; }
public bool IsSelected
{
get
{
return isselected;
}
set
{
isselected = value;
OnPropertyChanged("IsSelected");
}
}
#region INotifyPropertyChanged Members
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));
}
}
#endregion
}
<Grid>
<ListBox Height="500" Width="500" ItemsSource="{Binding Persons}" Margin="104,46,212,0" VerticalAlignment="Top" SelectedItem="{Binding InfoText}" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Margin="2,2,2,2" x:Name="tb" TextWrapping="Wrap" Text="{Binding Path=Name}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
<Setter Property="Background" TargetName="tb" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
公共部分类窗口1:窗口
{
可观察的集合人员;
公众人士
{
收到
{
返回人员;
}
设置
{
人=价值;
}
}
公共静态只读DependencyProperty InfoTextProperty=
从属属性。寄存器(
“信息文本”,
类型(人),
类型(窗口1),
新框架属性元数据(
新属性ChangedCallback(ChangeText));
公共窗口1()
{
初始化组件();
this.DataContext=this;
列表人员=新列表();
添加(新人物(“Makeda Wilde”);
人物。添加(新人物(“Rosamaria Becnel”);
添加(新人物(“Jarrett Bernstein”);
添加(新人物(“Leopoldo Palmer”);
添加(新人物(“蒂龙·费舍尔”);
人员。添加(新人员(“Elba Kilpatrick”);
添加(新人物(“象牙薰衣草”);
人员=新观察到的集合(人员);
//persons.CollectionChanged+=
//新System.Collections.Specialized.NotifyCollectionChangedEventHandler(
//人员(收集变更);
}
void persons\u CollectionChanged(对象发送方,System.Collections.Specialized.notifycollectionchangedventargs e)
{
}
公共ListBoxItem信息文本
{
收到
{
返回(ListBoxItem)GetValue(InfoTextProperty);
}
设置
{
SetValue(InfoTextProperty,value);
}
}
私有静态void ChangeText(DependencyObject源、DependencyPropertyChangedEventArgs e)
{
Person newPerson=(Person)e.NewValue;
newPerson.IsSelected=true;
Person oldPerson=(Person)e.oldpalue;
if(oldPerson!=null)
{
oldPerson.IsSelected=false;
}
}
//#区域InotifyProperty更改成员
//事件属性ChangedEventHandler属性Changed;
////创建OnPropertyChanged方法以引发事件
//受保护的void OnPropertyChanged(字符串名称)
//{
//PropertyChangedEventHandler处理程序=PropertyChanged;
//if(处理程序!=null)
// {
//处理程序(此,新PropertyChangedEventArgs(名称));
// }
//}
//#端区
}
公共类人员:INotifyPropertyChanged
{
private bool isselected=假;
公众人物(字符串名称)
{
this.Name=Name;
this.IsSelected=false;
}
公共字符串名称{get;set;}
公选学校
{
收到
{
选举产生的回报;
}
设置
{
isselected=值;
不动产变更(“IsSelected”);
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
//创建OnPropertyChanged方法以引发事件
受保护的void OnPropertyChanged(字符串名称)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(此,新PropertyChangedEventArgs(名称));
}
}
#端区
}
为了在视图模型中定义DependencyProperty
,视图模型类必须派生自DependencyObject
。否则,dependencProperty
将无法正常工作
您真的需要将属性设置为
DependencyProperty
?您考虑过实现吗?尽管您可以将ViewModel实现为具有依赖属性的DependencyObject
,但大多数人都认为最好使用POCO对象实现INotifyPropertyChanged
。。。请看Kent Boogaart对这两种方法的详细比较。安迪,这也是一个学习项目。我正在研究为什么这是不可能的。我尝试了INotifyPropertyChanged,它确实有效,但是如果我得到了我无法控制的业务对象呢?我不是在寻找清晰的答案,任何建议都是欢迎的。如果您无法控制您的业务对象,那么ViewModel类的角色可以将其包装成设计用于WPF可能性的东西(数据绑定、命令…),我有一个称为子类的Person集合作为Person类的属性。假设他们没有实现InotifyPropertyChanged。我可以将ListBox绑定到视图模型的observableCollection属性。子列表框将绑定到子集合。如果对子集合进行任何更改,它将不会反映回WPF(因为没有INotifyPropertyChanged)。我的假设错了吗?如果不是的话,我希望我能够使用依赖属性解决这个问题——比如给孩子们发送IsSelected。是否可以在ViewModel中为儿童进行其他包装。