在DataGridTextColumn中绑定ViewModel属性

时间:2013-12-28 20:44:24

标签: c# wpf data-binding mvvm catel

对于某个应用,我需要创建一个DataGridDataGridTextColumn具有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处理。

此致 斯蒂芬

2 个答案:

答案 0 :(得分:4)

如果无法访问视图模型,可以按如下方式定义第二个绑定:

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

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

答案 1 :(得分: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>