4

私が試みていること

  • ViewModel の一部である FilesToAdd というリストにバインドされた Datagrid があります。
  • そのデータグリッドに Combobox 列があります。
  • ComboBox の選択項目を FilesToAdd リスト項目の DocumentType プロパティにバインドしたいと考えています。
  • ただし、使用可能な選択肢のリストを、FilesToAdd リストではなく、ViewModel 自体のプロパティである AvailableDocumentTypes から取得したいと考えています。

XAML

<DataGrid ItemsSource="{Binding FilesToAdd}" Height="100" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" MaxHeight="100" AutoGenerateColumns="False" Visibility="{Binding FilesAreQueued, Converter={StaticResource BoolToVisConverter}}">
    <DataGrid.Resources>
        <app:BindingProxy x:Key="Proxy" Data="{Binding}"/>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="File Will be Uploaded As" Binding="{Binding FileDisplayText}"/>
        <DataGridTextColumn Header="Size" Binding="{Binding FileSizeInText}"/>
        <DataGridComboBoxColumn ItemsSource="{Binding AvailableDocumentTypes}" Header="Document Type" Visibility="{Binding Data.DocumentTypesAreRequired, Converter={StaticResource BoolToVisConverter}, Source={StaticResource Proxy} }">
        </DataGridComboBoxColumn>
    </DataGrid.Columns>
</DataGrid>

更新 1: 現在試している XAML + DataContext の説明

ケビンの提案に従って、私は試しました:

<DataGridComboBoxColumn ItemsSource="{Binding DataContext.AvailableDocumentTypes, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window }}}" Header="Document Type" Visibility="{Binding Data.DocumentTypesAreRequired, Converter={StaticResource BoolToVisConverter}, Source={StaticResource Proxy} }"/>

また試しました:

<DataGridComboBoxColumn ItemsSource="{Binding Path=DataContext.AvailableDocumentTypes, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window }}}" Header="Document Type" Visibility="{Binding Data.DocumentTypesAreRequired, Converter={StaticResource BoolToVisConverter}, Source={StaticResource Proxy} }"/>

しかし、見つからないというエラーが表示されます。

参考までに、私の DataContext は次のように設定されています。

XAML では:

<Window x:Class="VEUploader.WPF.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:VEUploader.WPF" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
        Title="{Binding WindowTitle}" SizeToContent="WidthAndHeight"
        DataContext="{StaticResource UploaderViewModel}"
        AllowDrop="True"
   >

コード内 (依存性注入を実行できるように):

public MainWindow()
{
    var uploaderViewModel = new UploaderViewModel(ObjectFactory.GetInstance<IVEDocumentService>(), ObjectFactory.GetInstance<IArgumentSettingsRetriever>(), ObjectFactory.GetInstance<IVEBudgetService>());
    Resources["UploaderViewModel"] = uploaderViewModel;


    InitializeComponent();
}
4

1 に答える 1

5

目の前にコンパイラはありませんが、構文は次のようになると思います。

{Binding DataContext.MyProperty, RelativeSource={RelativeSource Mode=FindAncestor, 
                             AncestorType={x:Type MyParentControl}}}

編集:実際に私自身のいくつかのテストを行っていますが、何らかの理由で何らかの理由でDataGridComboBoxColumn項目ソースを見つけることができませんが、独自のコンボボックス列をテンプレート化すると、うまく機能します. 理由はわかりませんが、これは許容できる回避策かもしれません。

<Window x:Class="WPFTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding FilesToAdd}" >
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Document Type">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox
                                ItemsSource=
                                "{Binding DataContext.AvailableDocumentTypes, 
                                RelativeSource={RelativeSource FindAncestor, 
                                AncestorType={x:Type Window }}}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

于 2013-08-08T16:14:59.560 に答える