在 DataGridTextColumn 中绑定 ViewModel 属性

Posted

技术标签:

【中文标题】在 DataGridTextColumn 中绑定 ViewModel 属性【英文标题】:Binding ViewModel property in DataGridTextColumn 【发布时间】:2013-12-28 20:44:24 【问题描述】:

对于一个应用程序,我需要创建一个DataGrid 和一个DataGridTextColumn,其中MultiBinding。 第一个 Binding 使用 ItemsSource 中给定的属性,第二个 Binding 应该使用我的 ViewModel 中的属性。

<DataGridTextColumn Header="Hourly wage" SortMemberPath="HourlyWage">
    <DataGridTextColumn.Binding>
        <MultiBinding StringFormat="01">
            <Binding Path="HourlyWage" />
            <Binding Path="CurrencyUnit" />
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

在这种情况下,HourlyWage 是当前项目的属性。 CurrencyUnit 是我的 ViewModel 中的一个属性。 如果我启动我的应用程序,此列是空的。那么如何让它同时显示呢?

我使用 Catel 作为我的 MVVM 框架和 MahApps.Metro 作为我的 GUI。我无法在我的 View 中创建 ViewModel,因为它是由 Catel 处理的。

问候, 斯蒂芬

【问题讨论】:

【参考方案1】:

如果不能访问视图模型,可以定义第二个绑定如下:

<Binding RelativeSource="RelativeSource AncestorType=DataGrid"
         Path="DataContext.CurrencyUnit" />

Binding 的源将设置为 DataGrid 实例。路径 DataContext.CurrencyUnit 将引用属性 YourViewModel.CurrencyUnit,假设您的视图模型包含数据网格的项目集合和货币单位属性。

【讨论】:

【参考方案2】:

您可以为视图模型实例的第二个绑定设置绑定源。 我使用了以下视图模型:

namespace WpfApplication1

    public class ViewModel
    
        public ViewModel()
        
            this.items = new List<Item> 
            new Item("13.4"),
            new Item("22.3");
        

        public List<Item> Items
        
            get  return this.items; 
        

        public string CurrencyUnit
        
            get  return "$"; 
        

        private List<Item> items;
    

而Item类如下:

namespace WpfApplication1

    public class Item
    
        public Item(string hWage)
        
            HourlyWage = hWage;
        

        public string HourlyWage  get; set; 
    

然后我使用了以下 XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <local:ViewModel x:Key="viewModel" />
    </Window.Resources>

    <Grid DataContext="StaticResource viewModel">
        <DataGrid AutoGenerateColumns="False" ItemsSource="Binding Items">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Hourly wage"
                                    SortMemberPath="HourlyWage">
                    <DataGridTextColumn.Binding>
                        <MultiBinding StringFormat="01">
                            <Binding Path="HourlyWage" />
                            <Binding Source="StaticResource viewModel"
                                     Path="CurrencyUnit" />
                        </MultiBinding>
                    </DataGridTextColumn.Binding>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

【讨论】:

不幸的是,我无法在我的 XAML 中添加 ViewModel,因为它会破坏 Catel 的功能。 (生成虚拟机两次)

以上是关于在 DataGridTextColumn 中绑定 ViewModel 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WPF 中的代码绑定 DataGridTextColumn 的可见性属性?

DataGridTextColumn 可见性绑定

Silverlight DataGridTextColumn 绑定可见性

WPF将DataGridTextColumn的背景颜色绑定为逐行着色

DataGridTextColumn.IsReadOnly 似乎有问题

在 DataGridTextColumn 中为 TextBlock 创建样式