1

我有一个名为 SharpComboBox 的用户控件。我正在使用 MVVM 模型用类别填充 SharpComboBox。为此,我需要设置 ItemsSource 属性。下面是SharpComboBox控件的用法。

  <sharpControls:SharpComboBox ItemsSource="{Binding Path=Categories}"  Grid.Column="1" Grid.Row="1" DisplayMemberPath="Title">   

            </sharpControls:SharpComboBox>

该窗口称为 AddBook.xaml,下面是代码:

 public AddBooks()
        {
            InitializeComponent();

            this.DataContext = new AddBookViewModel(); 

        }

这里是 AddBookViewModel 的实现。

 public class AddBookViewModel
    {

        private CategoryRepository _categoryRepository; 

        public AddBookViewModel()
        {
            _categoryRepository = new CategoryRepository();
        }



        public List<Category> Categories
        {
            get
            {
                return _categoryRepository.GetAll(); 
            }
        }

最后是 SharpComboBox 控件:

<StackPanel Name="stackPanel">
        <ComboBox x:Name="comboBox">       

            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <ItemsControl>

                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"></ColumnDefinition>
                                <ColumnDefinition Width="2*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>

                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"></RowDefinition>
                            </Grid.RowDefinitions>
                        </Grid>                                                

                         <TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding Path=Title}" Margin="10" />
                         <Image Grid.Column="1" Margin="10" Grid.Row="0" Width="100" Height="100" Stretch="Fill" Source="{Binding Path=ImageUrl}">

                        </Image>                                                  


                    </ItemsControl>
                </DataTemplate>
            </ComboBox.ItemTemplate>


        </ComboBox>

    </StackPanel>

这是背后的代码:

public partial class SharpComboBox : UserControl
    {
        public static DependencyProperty ItemsSourceProperty; 

        public SharpComboBox()
        {
            InitializeComponent();
            this.DataContextChanged += new System.Windows.DependencyPropertyChangedEventHandler(SharpComboBox_DataContextChanged);


            ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof (IEnumerable),
                                                              typeof (SharpComboBox), null);

            comboBox.ItemsSource = ItemsSource; 
        }

        public IEnumerable ItemsSource
        {
            get { return (IEnumerable) GetValue(ItemsSourceProperty); }
            set { SetValue(ItemsSourceProperty, value); }
        }

        void SharpComboBox_DataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
        {

        }

由于某种原因,ItemsSource 属性始终为空。

更新:

void SharpComboBox_DataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
        {
            var binding = new Binding();
            binding.Source = this.DataContext;
            **binding.Path = new PropertyPath("Categories");**
            comboBox.SetBinding(ComboBox.ItemsSourceProperty, binding); 
        } 
4

2 回答 2

2

kek444 非常接近,但缺少一个关键元素。我注意到您的 ViewModel 没有实现 INotifyPropertyChanged。这将防止绑定在您设置该属性时自动刷新。因此,正如 kek444 所提到的,您最初绑定到 null (因为它很早),然后当您设置它时,您并没有通知您的视图更改。不过,更改非常简单。

public class AddBookViewModel : INotifyPropertyChanged
{
    event PropertyChangedEventHandler PropertyChanged;
    public AddBookViewModel()
    {
         _categoryRepository = new CategoryRepository();
         if(PropertyChanged != null)
         {
              PropertyChanged(this, new PropertyChangedEventArgs("Categories");
         }
    }
    ...
}

每当您更改后备存储 (CategoryRepository) 时,您都需要这样做。根据您的存储库的实现,这里可能会有一些额外的复杂性,但这些信息至少应该解释发生了什么。

作为一种实践,我通常创建一个实现 INotifyPropertyChanged 的​​基本 ViewModel 类,因此我可以添加一些帮助方法来包装该 PropertyChanged 逻辑......我只调用 OnPropertyChanged("MyProp"); 就是这样。

可能对您有所帮助的另一件事是,如果您正确配置绑定,绑定将报告给调试输出:Debugging WPF Binding

希望这可以帮助。

于 2009-07-13T19:33:04.760 回答
0

您不能在构造函数中简单地从您的属性中设置comboBox.ItemsSource,谁知道这会发生多早。您需要在这两个属性之间设置绑定。

于 2009-07-13T18:38:18.677 回答