Wpf ViewModel中是否有依赖项属性的示例?

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

是否有人可以给出WPF中ViewModel中作为datacontext传递给view的依赖项属性的示例。这是否需要从DependencyObject继承? 假设我希望ListBox SelectedItem绑定到ViewModel中的依赖项属性CurrentItem。我让它从窗口对象工作,但同样的事情不与ViewModel工作。在ViewModel中,我使用GetProperty和SetProperty,而不是CLR属性

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中为儿童进行其他包装。