我有一个显示observableCollection of Persons内容的网格,以及两个显示所选行属性的文本框。如果您愿意,可以使用主 - 详细视图。
将observablecollection分配给datacontext时,您只需执行此操作:
<Grid>
<Grid Background="Gray">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
</Grid.RowDefinitions>
<igWPF:XamDataGrid Grid.Row="0" DataSource="{Binding}" IsSynchronizedWithCurrentItem="True" />
<StackPanel Grid.Row="1" Orientation="Horizontal">
<TextBox Height="21" Width="100" Margin="5,0,5,0" Text="{Binding Name}"></TextBox>
<TextBox Height="21" Width="100" Text="{Binding Age}"></TextBox>
</StackPanel>
</Grid>
</Grid>
IsSynchronizedWithCurrentItem-property确保网格中的选定项目是文本框中处理的项目。
我想知道当observablecollection不是直接在datacontext中时,是否有可能做到这一点,而是位于viewmodel(分配给窗口的datacontext)中。
public class TestViewModel: DependencyObject
{
public TestViewModel(){
Results = new ObservableCollection<Person>();
Results.Add(new Person { Age = "23", Name = "Able" });
Results.Add(new Person { Age = "25", Name = "Baker" });
}
public ObservableCollection<TagDlgmtEntity> Results
{
get { return (ObservableCollection<Person>)GetValue(ResultsProperty); }
set { SetValue(ResultsProperty, value); }
}
public static readonly DependencyProperty ResultsProperty =
DependencyProperty.Register("Results", typeof(ObservableCollection<Person>), typeof(TestViewModel), new PropertyMetadata(null));
}
我不想在可视树中的较低级别重新分配datacontext,或者与网格的selectedItem属性绑定。
是否可以这种方式使用这种机制?
谢谢!
答案 0 :(得分:0)
是的,这是可能的。像这样声明你的绑定:
DataSource="{Binding Results}"
示例ViewModel
假设:ViewModelBase
实施INotifyPropertyChanged
(请参阅我对该问题的评论)
public class MainWindowViewModel : ViewModelBase
{
private readonly List<Person> _results;
public MainWindowViewModel()
{
_results = new List<Person>
{
new Person {Age = "23", Name = "Able"},
new Person {Age = "25", Name = "Baker"}
};
ResultsView = CollectionViewSource.GetDefaultView(_results);
ResultsView.CurrentChanged += (sender, args) => RaisePropertyChanged(() => Name);
}
public ICollectionView ResultsView { get; private set; }
public string Name
{
get
{
return ((Person) ResultsView.CurrentItem).Name;
}
}
}