Привязка к свойству зависимости пользовательского элемента управления, определенного во время выполнения - PullRequest
1 голос
/ 28 февраля 2012

Я заметил, что есть много вопросов о свойствах зависимостей.Я надеюсь, что это достаточно отличается, о чем стоит спросить.Я также готов признать, что, возможно, я выбрал неправильный подход.

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

Спасибо за чтение моего вопроса.Я знаю, что это немного многословно, и не стесняйтесь сказать мне, если я просто неправильно понял основную концепцию.Мне просто нужно выяснить, в чем проблема.

...