对于某个应用,我需要创建一个DataGrid
,DataGridTextColumn
具有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处理。
此致 斯蒂芬
答案 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>