XML组合框彼此交叉绑定

时间:2018-12-24 16:42:59

标签: xml combobox binding

亲爱的

我正在通过自定义Autodesk DataStandard加载项的UI进入XML世界。

组合框1 应该填充XML文件中列出的项目 StandardTextInfo 。每个项目均由以下属性组成:
-StandardTextNumber
-StandardTextDE
-StandardTextEN
-StandardTextFR

这是 StandardText.XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<StandardTextData xmlns="">
  <StandardTextInfo StandardTextNumber="10" DE="KATZE" EN="CAT" FR="CHAT"></StandardTextInfo>
  <StandardTextInfo StandardTextNumber="20" DE="HUND" EN="DOG" FR="CHIEN"></StandardTextInfo>
  <StandardTextInfo StandardTextNumber="30" DE="PFERD" EN="HORSE" FR="CHEVAL"></StandardTextInfo>
</StandardTextData>

组合框2 应填充XML文件中列出的项目 LanguageInfo 。每个项目都由属性LanguageName(DE = Deutsch,EN = English,FR = Francais)组成。这是 Language.XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<LanguageData xmlns="">
  <LanguageInfo LanguageName="DE"></LanguageInfo>
  <LanguageInfo LanguageName="EN"></LanguageInfo>
  <LanguageInfo LanguageName="FR"></LanguageInfo>
</LanguageData>

以下是预期用途:
-用户从组合框2 中选择要显示的项目所用​​的语言为组合框1
-组合框1 DisplayMemberPath 中显示的值必须绑定到与在组合框2 中选择的值相对应的项属性。因此,项目名称可以用用户选择的语言显示。
-此外, Combobox3 显示 Combobox1 中所选项目的属性 StandardTextNumber 。通过使用组合框(我谈论的是Combobox3)而不是标签,用户还可以选择直接选择项目属性 StandardTextNumber ,从而反向更新显示在 Combobox1 (仍然使用 Combobox2 中定义的语言)。

这是XAML文件中3个组合框的定义:

    <?xml version="1.0" encoding="utf-8"?>
    <WPF:MainWindow>
        x:Name="FileWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WPF="clr-namespace:CreateObject.WPF;assembly=CreateObject"

    <Window.Resources>
        <XmlDataProvider>
            x:Key="Languages"
            Source="C:\Language.xml"
            XPath="/LanguageData"
        </XmlDataProvider>
        <XmlDataProvider
            x:Key="StandardTexts"
            Source="C:\StandardText.xml"
            XPath="/StandardTextData"
        </XmlDataProvider>
    </Window.Resources>

    <ComboBox>
        x:Name="Combobox1"
        IsEnabled="{Binding CreateMode}"
        ItemsSource="{Binding Source={StaticResource StandardTexts}, XPath="StandardTextInfo"}"
        SelectedItem="{Binding SelectedItem, ElementName=ComboBox3, Mode=OneWay}"
        SelectedValue="{Binding SelectedValue, ElementName=ComboBox2, Mode=OneWay}"
        SelectedValuePath="@StandardTextNumber"
        DisplayMemberPath="{Binding SelectedValue, ElementName=ComboBox3, Mode=OneWay}"
    </ComboBox>

    <ComboBox>
        x:Name="Combobox2"
        IsEnabled="{Binding CreateMode}"
        ItemsSource="{Binding Source={StaticResource Languages}, XPath="LanguageInfo"}"
        SelectedValue="{Binding Prop[LanguageName].value}"
        SelectedValuePath="@LanguageName"
        DisplayMemberPath="@LanguageName"
    </ComboBox>

    <ComboBox>
        x:Name="Combobox3"
        IsEnabled="{Binding CreateMode}"
        ItemsSource="{Binding Source={StaticResource StandardTexts}, XPath="StandardTextInfo"}"
        SelectedItem="{Binding SelectedItem, ElementName=ComboBox1, Mode=OneWay}"
        SelectedValue="{Binding SelectedValue, ElementName=ComboBox2, Mode=OneWay}"
        SelectedValuePath="{Binding SelectedValue, ElementName=ComboBox1, Mode=OneWay}"
        DisplayMemberPath="@StandardTextNumber"
    </ComboBox>

    </WPF:MainWindow>

我的问题:
1)组合框1 SelectedValue DisplayMemberPath 组合框3 SelectedValue SelectedValuePath < / em>:我可能会错失逻辑:应该如何表达所需的绑定?

2)在XML中,绑定属性前额的前缀@的目的是什么?

3)我非常确定确实不需要源 Language.XML :是否可以直接从源中标识的语言填充 Combobox2 em> StandardText.XML

4)在哪种情况下,应将IsEnabled属性设置为CreateMode或EditMode?

在此先感谢您提供的友善建议。

最好的问候, 莱昂

1 个答案:

答案 0 :(得分:0)

问题1的答案:

StandardText.XML Language.XML 文件未修改(请参见以上文章中的描述)

3个组合框 File.XAML Inventor.XAML 文件的修改(抱歉,我无法突出显示所做的修改):

<?xml version="1.0" encoding="utf-8"?>
<WPF:MainWindow>
    x:Name="FileWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WPF="clr-namespace:CreateObject.WPF;assembly=CreateObject"

<Window.Resources>
    <XmlDataProvider>
        x:Key="Languages"
        Source="C:\Language.xml"
        XPath="/LanguageData"
    </XmlDataProvider>
    <XmlDataProvider
        x:Key="StandardTexts"
        Source="C:\StandardText.xml"
        XPath="/StandardTextData"
    </XmlDataProvider>
</Window.Resources>

<ComboBox>
    x:Name="Combobox1"
    IsEnabled="{Binding CreateMode}"
    ItemsSource="{Binding Source={StaticResource StandardTexts}, XPath="StandardTextInfo"}"
    SelectedItem="{Binding SelectedItem, ElementName=ComboBox3, Mode=OneWay}"
    # SelectedValue: no need to be defined
    # SelectedValuePath: no need to be defined
    DisplayMemberPath="{Binding ElementName=Combobox2, StringFormat=@{0}, Path=SelectedValue}"
</ComboBox>

<ComboBox>
    x:Name="Combobox2"
    IsEnabled="{Binding CreateMode}"
    ItemsSource="{Binding Source={StaticResource Languages}, XPath="LanguageInfo"}"
    SelectedValue="{Binding Prop[LanguageName].value}"
    SelectedValuePath="@LanguageName"
    DisplayMemberPath="@LanguageName"
</ComboBox>

<ComboBox>
    x:Name="Combobox3"
    IsEnabled="{Binding CreateMode}"
    ItemsSource="{Binding Source={StaticResource StandardTexts}, XPath="StandardTextInfo"}"
    SelectedItem="{Binding SelectedItem, ElementName=ComboBox1, Mode=OneWay}"
    # SelectedValue: no need to be defined
    SelectedValuePath="@StandardTextNumber"
    DisplayMemberPath="@StandardTextNumber"
</ComboBox>

</WPF:MainWindow>

最后不做太多修改即可获得预期的结果。要点是:

-了解 SelectedValue SelectedValuePath 属性的目的

-绑定语法StringFormat = @ {0}

问题2至4现在毫无意义。

非常感谢北京RNL软件科技有限公司的白雪松提供了解决方案!

最诚挚的问候。