0
我知道这有很多问题,但我找不到正确的答案,或者我不明白正确的解决方法。 我有我的列表框在主窗口,它是由自定义对象(FooObjClass)填充。如何使用MVVM管理列表框中的用户控件?
<ListBox x:Name="FooListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<fooNameSpace:FooObjView/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
的FooObjView是用户控制
<UserControl x:Class="PLCS7_TEST.SmartObjRecognize.SmartObjView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Test.FooObjRecognize"
mc:Ignorable="d" Width="Auto">
<UserControl.DataContext>
<local:FooViewModel/>
</UserControl.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Path=FooObjprop.Name}"/>
<TextBlock Grid.Column="1" Text="{Binding Path=FooObjprop.Type}">
</Grid>
,这是我FooViewModel
class FooViewModel : ObservableObject
{
private FooObjClass fooObjmember;
public FooObjClass FooObjprop
{
get { return fooObjmember; }
set
{
this.fooObjmember= value;
base.RaisePropertyChanged("FooObjprop");
}
}
}
的FooObjClass是正常类和ObservableObject类是这样的:
public abstract class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
var propertyName = PropertySupport.ExtractPropertyName(propertyExpresssion);
this.RaisePropertyChanged(propertyName);
}
protected void RaisePropertyChanged(String propertyName)
{
VerifyPropertyName(propertyName);
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public void VerifyPropertyName(String propertyName)
{
// verify that the property name matches a real,
// public, instance property on this Object.
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
{
Debug.Fail("Invalid property name: " + propertyName);
}
}
}
现在,我可以做什么将列表框(它是FooObjClass)的项目对象传递给最后一个FooModelView?我必须使用依赖属性?但是如何?我tryed我readed,但是我没有找到解决办法
着这片代码,我可能到列表框中的项目对象传递给FooViewModel
<UserControl.DataContext>
<local:FooViewModel fooObjmember="{Databinding}"/>
</UserControl.DataContext>
但fooObjmember不是依赖属性,当我试图创建一个依赖属性它是相同的
谢谢你,我的英语水平很抱歉;)
感谢@Aybe,我给自己定德listbox.Datacontext因为我有其他人认为窗口,我从你的代码复制其余的,这一切没有任何限制,但用户控件中的datacontext为null。列表框里面有项目。 – ek32
你应该发布一些代码... – Aybe
它是一样的,你发布,唯一的区别是在窗口代码。而不是DataContext =新列表我写了listbox.Datacontext =新列表。当我调试我看到列表框中的对象,但在用户控件插入var x = this.Datacontext(在InitializeComponent()后)我看到它是空的。 –
ek32