1

对于一个应用程序,我需要创建一个DataGridwith a DataGridTextColumnwhich has MultiBinding。第一个Binding使用 ItemsSource 中给定的属性,第二个Binding应该使用我的 ViewModel 中的属性。

<DataGridTextColumn Header="Hourly wage" SortMemberPath="HourlyWage">
    <DataGridTextColumn.Binding>
        <MultiBinding StringFormat="{}{0}{1}">
            <Binding Path="HourlyWage" />
            <Binding Path="CurrencyUnit" />
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

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

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

问候,斯特凡

4

2 回答 2

5

如果您无法访问视图模型,您可以定义第二个绑定,如下所示:

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

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

于 2013-12-28T23:21:49.037 回答
0

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

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="{}{0}{1}">
                            <Binding Path="HourlyWage" />
                            <Binding Source="{StaticResource viewModel}"
                                     Path="CurrencyUnit" />
                        </MultiBinding>
                    </DataGridTextColumn.Binding>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
于 2013-12-28T21:39:22.727 回答