绑定到运行时定义的用户控件的依赖项属性

时间:2012-02-28 19:05:32

标签: c# data-binding mvvm dependency-properties

我注意到有很多依赖属性问题。我希望这有点不同,值得一提。我也愿意承认我可能采取了错误的做法。

我目前的任务是创建一个带有自定义搜索参数用户控件的搜索窗口。您拥有用户控件的想法是进行搜索并确定搜索参数,搜索结果显示在主窗口的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绑定设置为UserControl视图模型的SearchResults依赖项属性。

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>

请注意,我已将用户控件的名称及其数据上下文设置为我的视图模型。

除了InitializeComponent()之外,我的DVDSearch.xaml.cs是空的。

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

我遇到的问题是DataSearchBase窗口上的searchResultsGrid没有绑定到DVDSearchControlViewModel的SearchResults。所有其他绑定都正常工作,SearchResults在构造函数期间和OnSearch方法期间都被填充(就像在更新中一样)。

感谢您阅读我的问题。我知道它有点啰嗦,并且毫不犹豫地告诉我,我是否真的有一个非常基本的概念。我只需要弄清问题是什么。

0 个答案:

没有答案