Я заметил, что есть много вопросов о свойствах зависимостей.Я надеюсь, что это достаточно отличается, о чем стоит спросить.Я также готов признать, что, возможно, я выбрал неправильный подход.
В настоящее время мне поручено создать окно поиска с пользовательским элементом управления пользовательскими параметрами поиска.Идея состоит в том, что пользовательский элемент управления выполняет поиск и определяет параметры поиска, а результаты поиска отображаются в GridView главного окна.Поэтому основная проблема заключается в том, что у меня есть ObservableCollection в модели представления пользовательского элемента управления, которая определена как свойство зависимостей, и мне нужно привязать DataGrid главного окна к этой ObservableCollection.Чтобы добавить последний уровень сложности, пользовательский элемент управления для окна определяется во время выполнения путем передачи его в конструктор окна.
DataSearchBase.xaml.cs
public DataSearchBase(BaseUserSearch us)
{
InitializeComponent();
userSearchControl = us;
SetSearchUserControl();
ResetTitle();
SetupGridColumns();
}
private void SetSearchUserControl()
{
Grid.SetRow(userSearchControl, 0);
Grid.SetColumn(userSearchControl, 0);
SearchGrid.Children.Add(userSearchControl);
DataContext = userSearchControl;
}
Обратите внимание, что я установилконтекст данных для базового окна для userSearchControl
DataSearchBase.xaml
<DVD:SimpleEditWindowBase
x:Class="DVDLibrary.View.DataSearchBase"
xmlns:DVD="clr-namespace:DVDLibrary.View"
x:Name="DataSearch_frm">
...
<DataGrid AutoGenerateColumns="False"
Name="searchResultsGrid"
ItemsSource="{Binding ElementName=UserSearch,Path=DataContext.SearchResults,
UpdateSourceTrigger=PropertyChanged}"/>
Обратите внимание, что именно здесь я пытаюсь установить привязку ItemsSource к свойству зависимости SearchResults модели представления UserControl модели представления.
DVDSearch.xaml
<UserControl
x:Class="DVDLibrary.View.DVDSearch"
xmlns:local="clr-namespace:DVDLibrary.View"
xmlns:vm="clr-namespace:DVDLibrary.ViewModel"
mc:Ignorable="d"
x:Name="UserSearch"
>
<UserControl.DataContext>
<vm:DVDSearchControlViewModel />
</UserControl.DataContext>
</local:BaseUserSearch>
Обратите внимание, что я установил имя пользовательского элемента управления и его контекст данных для моей модели представления.
Мой DVDSearch.xaml.cs пуст, кроме InitializeComponent ().
DVDSearchControlViewModel.cs
class DVDSearchControlViewModel : DependencyObject, INotifyPropertyChanged
{
public DVDSearchControlViewModel()
{
//base
SearchCommand = new DelegateCommand<object>(OnSearch, CanSearch);
SearchResults = dvdList.DVDs; //a populated list of my DVDModel class.
}
public static readonly DependencyProperty SearchResultsProperty =
DependencyProperty.Register("SearchResults",
typeof(ObservableCollection<DVDModel>), typeof(DVDSearchControlViewModel),
new PropertyMetadata(new ObservableCollection<DVDModel>()));
public ObservableCollection<DVDModel> SearchResults
{
get { return (ObservableCollection<DVDModel>)this.GetValue(SearchResultsProperty); }
set { this.SetValue(SearchResultsProperty, value); }
}
public DelegateCommand<object> SearchCommand { get; private set; }
private void OnSearch(object arg)
{
var results = (from DVD in DVDs
where DVD.TypeOfDisk == DiskType.DiskTypeID
select DVD).ToList();
foreach (DVDModel model in results)
{
SearchResults.Add(model);
}
}
private bool CanSearch(object arg)
{
if (DiskType == null && Director == null)
{
return false;
}
return true;
}
}
Проблема, с которой я столкнулся, заключается в том, что searchResultsGrid включенокно DataSearchBase не привязано к SearchResults объекта DVDSearchControlViewModel.Все остальные привязки работают, и SearchResults заполняется как во время конструктора, так и во время метода OnSearch (как в процессе его обновления).
Спасибо за чтение моего вопроса.Я знаю, что это немного многословно, и не стесняйтесь сказать мне, если я просто неправильно понял основную концепцию.Мне просто нужно выяснить, в чем проблема.