1

我已经为这个问题苦苦挣扎了两个星期了。我在 Google 和 Stackoverflow 上进行了全面搜索,但似乎找不到正确的答案。

通常我不喜欢问问题,除非绝对必要,但我真的想不通这个!

问题如下。

我有一个带有两个 ViewModel 的应用程序。

一个包含可以在单独页面上创建的项目列表。

当用户返回主应用程序时,我有一个 DataGrid,当我向 DataGrid 添加一行时,一个 ComboBox 列在一个 Column 中,这个 ComboBox 包含来自第一个 ViewModel 的项目。

我想要发生的是,当用户从这个 ComboBox 中选择一个项目时,我希望 ComboBox 中的值遇到 DataGrid 的当前 ViewModel 并更改 DataGrid 中另一个项目的值。

我目前有以下设置,但我仍然无法让它工作。

如果可能的话,我最好用直接的 XAML 来做到这一点。

显然,下面的 XAML 是错误的。

<DataGrid Style="{StaticResource dataGridStyle}" ItemsSource="{Binding CurrentParser.InputVariables}" AutoGenerateColumns="False" Margin="6,6,35,6" Name="dgInputVarDefs">

<!--
<DataGrid.Triggers>
    <EventTrigger RoutedEvent="ComboBox.SelectionChanged">
    </EventTrigger>
</DataGrid.Triggers>
-->

<DataGrid.Columns>

    <DataGridTextColumn Header="#" Binding="{Binding Path=number}" />
    <DataGridTextColumn Header="Name" Binding="{Binding Path=name}" />

    <DataGridTemplateColumn x:Name="dgtcFormatter" Header="->Formatter">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox 
                    ItemsSource="{Binding Source={StaticResource FormatterViewModel}, 
                    Path=CurrentFormatter.formats}" 
                          x:Name="cbFormatter" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <DataGridTemplateColumn x:Name="dgtcFormat" Header="->Format">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBox x:Name="dgtcFormatTextBox" Text="{Binding Path=format.format}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <DataGridTextColumn Header="Separator" Binding="{Binding Path=separator}" />
    <DataGridTextColumn Header="Preview" Binding="{Binding Path=preview, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/>
</DataGrid.Columns>
</DataGrid>
4

1 回答 1

1

我不确定您是如何为表单设置视图模型的,但我倾向于确保每个表单只有一个视图模型。

如果您的组合框使用与数据网格相同的视图模型,那么您可以在组合的 XAML 中使用以下内容:

<ComboBox ItemsSource="{Binding Path=DataContext.myCollection, RelativeSource={RelativeSource    
      Mode=FindAncestor, AncestorType={x:Type Window}}}"/>

这让您的组合使用不同于ItemsSource数据网格的方式。

于 2011-11-14T10:29:25.657 回答