c# - 如何使用 XAML 将 DatagridComboBoxColumn 绑定(bind)到不在 DataGrid 的 ItemsSource 中的 ViewModel 属性?

标签 c# wpf xaml data-binding mvvm

我在尝试什么

  • 我有一个绑定(bind)到名为 FilesToAdd 的列表的数据网格,它是我的 ViewModel 的一部分。
  • 我在该数据网格上有一个 Combobox 列。
  • 我想将 ComboBox 的选定项绑定(bind)到 FilesToAdd 列表项的 DocumentType 属性。
  • 但是,我想要一个来自 AvailableDocumentTypes 的可用选项列表,它是 ViewModel 本身的一个属性,而不是 FilesToAdd 列表的一个属性。

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 说明

根据 Kevin 的建议,我尝试了:

<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"
   >

在代码中(这样我就可以进行依赖注入(inject)):

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


    InitializeComponent();
}

最佳答案

我面前没有编译器,但我相信语法应该是这样的:

{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>

关于c# - 如何使用 XAML 将 DatagridComboBoxColumn 绑定(bind)到不在 DataGrid 的 ItemsSource 中的 ViewModel 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130881/

相关文章:

wpf - 资源字典中的资源未得到应用

c# - 在 WPF 中应用程序启动时应默认选择 ListView 项

c# - 我为什么可以将 IWebDriver 转换为 IJavaScriptExecutor?

c# - 为什么我应该使用 SecureString 而不是字符串?

c# - gridview 将下拉列表绑定(bind)到 List<keyvaluePair<int, string>>

c# - 来自 .NET Standard 类库的日志消息

c# - 如何在 wpf 中的 ItemsPanelTemplate 中找到控件?

.net - 动态 LINQ 查询

c# - 如何在 UWP 应用程序中保留 TextBlock 的空白

c# - 组合框显示命名空间.ViewModel