2013-10-01 4 views
0

У меня есть сетка, отображающая содержимое наблюдаемого набора людей и два текстовых поля, показывающие свойства выбранной строки. Если вы захотите, просмотрите мастер-деталь.Связывание с коллекцией в viewmodel с IsSynchronizedWithCurrentItem

При назначении 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-свойство гарантирует, что выбранный элемент в сетке является один, который обрабатывается в текстовых полях.

Мне было интересно, можно ли сделать эту точную вещь, когда наблюдаемое собрание не находится непосредственно в datacontext, а скорее расположено в режиме просмотра (который назначается 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

Я бы порекомендовал реализации ViewModel по-разному. Либо реализуйте свою собственную ViewModelBase, которая реализует «INotifyPropertyChanged» или (лучше IMO), используя структуру MVVM, например, например. [MVVMLight] (http://mvvmlight.codeplex.com/), который дает вам приличную ViewModelBase бесплатно. Обычно вам не нужно возиться с зависимыми свойствами в ViewModel. – EagleBeak

ответ

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; 
     } 
    } 
} 
+0

Спасибо! Этот трюк «Имя-собственность» не произошел со мной. – Bjorn

Смежные вопросы