WPF中的双向树视图绑定

时间:2013-05-02 03:42:04

标签: c# wpf xml treeview

我遇到过一个问题,我需要使用XML文件管理我正在创建的插件中的各种类别。它由两部分组成:

  1. 在开始时加载所有类别,并使用方法将它们添加到Outlook中:

      

    AddCategory(字符串名称,字符串颜色,字符串快捷方式)

  2. 能够在应用程序中管理类别。

  3. 只要它是硬编码的,我就已经完成了AddCategory的工作。自从我开始使用XML以来,还没有真正处理过它。我想如果我能够找到类别管理部分,这将会落实到位。所以下面我发布了三段代码,用于显示的WPF,它使用HierarchicalDataTemplate来尝试显示XML(仅列出MailBoxes)和XML文件本身。在我看来,我应该使用双向绑定,以便我可以从管理界面添加和删除部分XML文件。 从本质上讲,我觉得最好的方法是编写这个设置。我需要能够轻松访问各种类别,因为它们非常容易应用于邮箱。任何帮助或方向将不胜感激。我已经在这里查看了与HDT,XML和WPF有关的所有其他各种问题,并且还没有进一步了解。我的LINQfu很弱,因为我的绑定知识。

    WPF代码

    <Grid Name="mainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>
        <Grid.Resources>
            <XmlDataProvider x:Key="CategoriesData" Source="Categories.xml" XPath="MailBoxes"/>
    
            <!--Template for Rule-->
            <HierarchicalDataTemplate x:Key="ruleHDT"
                                      ItemsSource="{Binding XPath=@Rules/Rule}">
                <TextBlock Text="{Binding XPath=@Action}" />
            </HierarchicalDataTemplate>
    
            <!--Template for Category-->
            <HierarchicalDataTemplate x:Key="categoryHDT"
                                      ItemTemplate="{StaticResource ruleHDT}"
                                      ItemsSource="{Binding XPath=@Categories/Category}">
                <TextBlock Text="{Binding XPath=@Name}" />
            </HierarchicalDataTemplate>
    
            <!--Template for MailBox-->
            <HierarchicalDataTemplate x:Key="mailboxHDT"
                                      ItemTemplate="{StaticResource categoryHDT}"
                                      ItemsSource="{Binding XPath=@MailBoxes/MailBox}">
                <TextBlock Text="{Binding XPath=@Name}" />
            </HierarchicalDataTemplate>
    
        </Grid.Resources>
        <TreeView Grid.Column="0" Grid.Row="0" Margin="5" ItemsSource="{Binding Source={StaticResource CategoriesData}, XPath=MailBox}"
                  ItemTemplate="{StaticResource mailboxHDT}"/>
        <StackPanel Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" Height="100" Margin="5" VerticalAlignment="Top">
            <Button Content="Add" Margin="5"/>
            <Button Content="Remove" Margin="5" Width="80"/>
        </StackPanel>
        <StackPanel Grid.Column="0" Grid.Row="1" Margin="5" Orientation="Horizontal" VerticalAlignment="Center">
            <RadioButton Content="All MailBoxes" GroupName="MailBoxXMLView" Margin="0,0,5,0" />
            <RadioButton Content="Accessible MailBoxes" GroupName="MailBoxXMLView" Margin="5,0,0,0" IsChecked="True"/>
        </StackPanel>
        <StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2" Orientation="Horizontal" Margin="5" VerticalAlignment="Center">
            <Button Content="Import" Margin="0,0,5,0" Width="80"/>
            <Button Content="Export" Width="80"/>
        </StackPanel>
    </Grid>
    

    XML文件

    <?xml version="1.0" encoding="utf-8" ?>
    <MailBoxes>
      <MailBox Name="MB01">
        <Categories>
          <Category Name="Clean">
            <Color>olCategoryColorGreen</Color>
            <Shortcut>olCategoryShortcutKeyCtrlF3</Shortcut>
            <Rules>
              <Rule Action="Only">Clean</Rule>
            </Rules>
          </Category>
          <Category Name="Spam">
            <Color>olCategoryColorYellow</Color>
            <Shortcut>olCategoryShortcutKeyCtrlF4</Shortcut>
            <Rules>
              <Rule Action="Remove">Clean</Rule>
            </Rules>
          </Category>
        </Categories>
      </MailBox>
      <MailBox Name="MBTest01">
        <Categories>
          <Category Name="Cat01">
            <Color>olCategoryColorRed</Color>
            <Shortcut>olCategoryShortcutKeyNone</Shortcut>
            <Rules>
            </Rules>
          </Category>
          <Category Name="Cat02">
            <Color>olCategoryColorYellow</Color>
            <Shortcut>olCategoryShortcutKeyNone</Shortcut>
            <Rules>
            </Rules>
          </Category>
        </Categories>
      </MailBox>
    </MailBoxes>
    

1 个答案:

答案 0 :(得分:1)

XmlDataProvider不支持双向绑定。 它只在你想要暴露一些数据时才有用,但在你需要操作它们时却没有用。

如果你真的需要使用xml而不是自定义保存文件,那么这里有一个链接,解释了如何在xml文件中手动保存修改: http://www.codeproject.com/Articles/26875/WPF-XmlDataProvider-Two-Way-Data-Binding