WPF中的双向树视图绑定

本文关键字:视图 绑定 WPF | 更新日期: 2023-09-27 18:11:40

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

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

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

  2. 能够从应用程序内部管理类别

我已经得到的AddCategory工作得很好,只要它是硬编码的。自从我开始使用XML以来,还没有真正处理过它。我想,如果我能把分类管理部分弄清楚,这就很容易了。因此,我在下面发布了三段代码:使用HierarchicalDataTemplate试图显示XML(只能列出邮箱)的显示的WPF和XML文件本身。在我看来,我应该使用双向绑定,这样我就可以在管理接口中添加和删除XML文件的某些部分。实际上,我不知道编写这种设置的最佳方法是什么。我需要能够很容易地访问各种类别,因为它们适用于邮箱相当容易。任何帮助或指导将不胜感激。我已经看了所有与HDT, XML和WPF有关的其他各种问题,只是没有得到任何进一步。我的LINQfu很弱,我的binding知识也很弱。

<<p> WPF代码/strong>
<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>

WPF中的双向树视图绑定

XmlDataProvider不支持双向绑定。它只在您想要公开某些数据时有用,但在您需要操作它们时并不真正有用。

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