0

解决了

当 ProductDialogBox 显示时,我希望 ComboBox 显示类别名称(通过转换器绑定到 int CategoryId),但除非我从 TreeView 手动选择某个类别,否则它不会更新。解决方案是将 SelectedIndex="0" 添加到 ComboBox

到目前为止,任务的实现如下...

ProductDialogBox.xaml

<UserControl.Resources>
        <converter:CategoryIdConverter x:Key="categoryIdConverter" />

        <HierarchicalDataTemplate x:Key="NodeTemplate" ItemsSource="{Binding Path=Categories}">
            <StackPanel Orientation="Horizontal">
                <Image Source="/GSM.UI;component/Resources/Images/folder.png" Margin="1,1,3,1"/>
                <TextBlock x:Name="tb" Text="{Binding Path=Name}"/>
            </StackPanel>
        </HierarchicalDataTemplate>

        <DataTemplate x:Key="CategoryItemTemplateCollapsed">
            <TextBlock Text="{Binding Path=Name, Mode=OneWay}" 
                       DataContext="{Binding 
                           Path=DataContext.CategoryId,
                           RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                           Converter={StaticResource categoryIdConverter}}"/>
        </DataTemplate>

        <DataTemplate x:Key="CategoryItemTemplateExpanded">
            <TreeView ItemTemplate="{StaticResource NodeTemplate}" HorizontalAlignment="Stretch" Margin="-4 0 -4 0" Foreground="#FF3C3C3C"
                      ItemsSource="{Binding Path=ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}}">
                <i:Interaction.Behaviors>
                    <b:BindableSelectedItemBehavior SelectedItem_="{Binding 
                        Path=DataContext.CategoryId, Mode=TwoWay, 
                        Converter={StaticResource categoryIdConverter}, 
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
                </i:Interaction.Behaviors>
                <TreeView.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <Setter Property="TreeViewItem.IsExpanded" Value="True"/>
                    </Style>
                </TreeView.ItemContainerStyle>
            </TreeView>
        </DataTemplate>
    </UserControl.Resources>

<ComboBox ItemsSource="{Binding Path=Categories}" SelectedIndex="0">
            <ComboBox.ItemTemplateSelector>
                <dt:CategoryTemplateSelector/>
            </ComboBox.ItemTemplateSelector>
        </ComboBox>
</UserControl>

ProductDialogViewModel.cs

    public ProductDialogViewModel(ProductViewModel product, bool update)
    {
        if(update)
            _product = updateProduct.Product;
        else
            _product = new Product();
    }

    public int CategoryId
    {
        get { return _product.CategoryId; }
        set
        {
            if (value.Equals(_product.CategoryId))
                return;

            _product.CategoryId = value;

            base.OnPropertyChanged("CategoryId");
         }
    }

OLD QUESTION 请告知我如何通过显示的文本实现DialogBoxViewModelTreeView所选项目之间的两种方式绑定?内部显示按属性ComboBox的集合。当用户在其中选择一个类别时,一个文本设置为类别名称和属性设置为 selected 。和回退,当属性设置时,选定的项目被设置,文本显示相应的类别名称TreeViewComboBoxCategoryViewModelNameTreeViewComboBoxDialogBoxViewModelCategoryIdIdCategoryVMDialogBoxVMCategoryIdTreeViewComboBox

通过将 ComboBox 选择的值绑定到相同的属性 CategoryId 部分解决了该问题,但在设置 CategoryId 时它仍然不显示任何内容。

// ViewModel
ProductDialogBoxViewModel.cs
    int CategoryId
    ObservableCollection<CategoryViewModel> Categories;

// View
ProductDialogBoxView.xaml

    <ComboBox SelectedValue="{Binding Path=CategoryId, Converter={StaticResource categoryIdNameConverter}, Mode=OneWay}"
              DisplayMemberPath="SelectedValue.Name">
      <ComboBoxItem>
         <TreeView ItemsSource={Binding Categories} ItemTemplate={<-- displays name of category -->}>
            <interaction:Interaction.Behaviors>
               <behavior:BindableSelectedItemBehavior 
                    SelectedItem_="{Binding Path=CategoryId, 
                                            Mode=TwoWay, 
                                            Converter={StaticResource categoryNameIdConverter}}" />
            </interaction:Interaction.Behaviors>
         </TreeView>
      <ComboBoxItem>
    </ComboBox>
4

1 回答 1

0

无法将 of 设置SelectedItemComboBox不在其 ItemsSource 中的项目。我有类似的要求在 Combobox 中显示树视图。我要做的是创建新的组合框模板,您可以在其中完全控制文本区域和组合弹出窗口。然后,我将 TreeView 放在控件模板中的 Combobox 弹出窗口中,并绑定了我想在 TreeView 选定项的选择更改时显示的文本。

您可以在此处找到默认组合框模板http://msdn.microsoft.com/en-us/library/dd334408%28v=vs.95%29.aspx并更改您想要的部分。

您应该具有inSelectedCategory类型CategoryViewModel的属性ProductDialogBoxViewModel。然后您可以直接将 Treeview 的 SelectedItem 绑定到此属性,例如<TreeView ItemsSource={Binding Categories} SelectedItem = {Binding SelectedCategory}/>

每当 treeview 的选定项发生变化时,您的 SelectedCategory 就会发生变化,反之亦然。然后您可以将此 SelectedCategory Name 绑定到创建的控件模板中的组合框的文本区域。

谢谢

于 2013-09-02T08:06:56.243 回答