我在视图中有一个数据网格
<Grid x:Name="LayoutRoot" Background="White" Width="600" MaxHeight="150">
<sdk:DataGrid x:Name="grid1" ItemsSource="{Binding Persons}" SelectedItem="{Binding MyList, Mode=TwoWay}">
</sdk:DataGrid>
</Grid>
在我的ViewModel中,我有以下代码
private ObservableCollection<string> myList;
public ObservableCollection<string> MyList
{
get { return myList; }
set
{
myList = value;
NotifyPropertyChanged(vm => vm.MyList);
}
对于DG
private ObservableCollection<Person> person;
public ObservableCollection<Person> Persons
{
get { return person; }
set
{
person = value;
NotifyPropertyChanged(vm => vm.Persons);
}
}
我希望从View中我可以将数据网格的选定项目(行)绑定到我的视图模型中的MyList集合(可能是IList vs OC?)。我只需要所选行中的一个值,例如地址或zip。但是,我是否需要传递整个集合?我可以通过另一种方式将一个单元格值放入视图模型中吗?
例如,这里是我用来填充数据网格的类
public void CreateList()
{
Person p = new Person();
p.FirstName = "Bob";
p.LastName = "Jones";
p.Address = "123 Main Street";
p.City = "Wilmington";
p.State = "NC";
p.Zip = "12345";
Person p1 = new Person();
p1.FirstName = "Sue";
p1.LastName = "Smith";
p1.Address = "1222 Main Street";
p1.City = "Tampa";
p1.State = "FL";
p1.Zip = "12345";
Person p2 = new Person();
p2.FirstName = "Chris";
p2.LastName = "Jones";
p2.Address = "234 Water Street";
p2.City = "Dallas";
p2.State = "TX";
p2.Zip = "22222";
Person p3 = new Person();
p3.FirstName = "Andy";
p3.LastName = "Jones";
p3.Address = "434 Main Street";
p3.City = "Columbia";
p3.State = "SC";
p3.Zip = "12345";
ObservableCollection<Person> Result = new ObservableCollection<Person>();
Result.Add(p);
Result.Add(p1);
Result.Add(p2);
Result.Add(p3);
Persons = Result;
}
加载视图模型时会触发此类。我希望能够选择第三行数据,并仅将地址值传递回VM。我的初衷是将整个选定的行传递回vm,然后从该集合中提取地址。
使用selectedItem绑定不起作用,选择一行永远不会触发vm中的inotify事件,所以我知道集合没有被更新,除非我点击DG然后在它之外只传递一个空值。其次,是否有一种更有效的方法来实现这一点,而不是使用后面的代码来提取值然后将其传递给VM?我曾想过在视图中使用选择更改事件,然后将列值设置为传递给vm的绑定字段,但这看起来很糟糕。
感谢您的任何建议或想法。
-cheers
答案 0 :(得分:1)
它认为你已经在这个MyList
属性中投入了一些曲线球,你想要“绑定所选项目”。在其他任何地方,包括您自己的解决方案,您都可以参考绑定到单个项目。那么为什么有一个属性来接收它是一个列表类型?
在我看来,你需要的是放弃MyList,只需要: -
private Person mySelectedItem;
public Person SelectedItem
{
get
{
return mySelectedItem;
}
set
{
mySelectedItem = value;
NotifyPropertyChanged("SelectedItem");
}
}
现在你对DataGrid
的约束是有道理的: -
<sdk:DataGrid x:Name="grid1" ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
你的TextBlock
看起来像是: -
<TextBlock x:Name="textholder" Text="{Binding SelectedItem.FirstName}" />
答案 1 :(得分:0)
<强>更新强> 我正在采取的当前方法是在我有以下
的视图背后的代码中 private void grid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Person selectedPerson = grid1.SelectedItem as Person;
textholder.Text = selectedPerson.Address;
}
然后在视图中我有一个文本字段
<TextBlock x:Name="textholder" Text="{Binding SelectedID, Mode=TwoWay}"/>
绑定到VM中的SelectedID属性
这可以运行并获取VM的值。这在实现中看起来很奇怪(但是使用命令和命令参数的代码要少得多:))。我欢迎任何其他想法。
-cheers