gpt4 book ai didi

.net - 在 WPF MVVM 中绑定(bind)到没有代理对象的派生属性

转载 作者:行者123 更新时间:2023-12-03 10:55:38 24 4
gpt4 key购买 nike

假设我有一个域模型,例如:

class User  {
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
public int Age { get; set; }
// tons of other stuff
}

我有一个 ObservableCollection其中称为 UserList ,我像这样绑定(bind)到 DataGrid:
<dg:DataGrid ItemsSource="{Binding Path=UserList}" SelectedIndex="{Binding Path=Selecteduser}">
<dg:DataGrid.Columns>
<dg:DataGridTextColumn Header="Name" Binding="{Binding Path=FirstName, Mode=OneWay}" />
<dg:DataGridTextColumn Header="Age" Binding="{Binding Path=Age, Mode=OneWay}" />
</dg:DataGrid.Columns>
</dg:DataGrid>

现在我决定为用户的全名添加一个网格列。我的 User对象没有这个属性,但是如果你给我一个 User 它很容易计算出来。目的。如何在我的 User 上绑定(bind)到这样一个派生的“属性”?对象,而不为 User 创建代理类(又名 View 模型)并重写大量代码来处理这个代理,将状态从域对象复制到代理对象等等?

一个相当干净和明显的解决方案将是一个扩展方法,但显然你不能绑定(bind)到它。

我只想能够告诉网格:对于这个列,给我一个用户和一些指示这是什么的键(例如“全名”),我会将数据传回给你用于列。

最佳答案

您当然可以通过像这样的多重绑定(bind)来创建大多数派生属性:

<DataGridTextColumn Header="FullName">
<DataGridTextColumn.Binding>
<MultiBinding StringFormat="{}{0} {1}}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>

对于更复杂的事情,您可能必须直接绑定(bind)到 User 对象并使用 binding converter使用创建派生值的转换器参数:
public class UserConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
User user = (User)value;
string result = string.Empty;

switch ((string)parameter)
{
case "FullName":
result = string.Format("{0} {1}", user.FirstName, user.LastName);
break;
}

return result;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

然后像这样绑定(bind):
<DataGridTextColumn Header="FullName"
Binding="{Binding Converter={StaticResource UserConverter}, ConverterParameter=FullName}"/>

关于.net - 在 WPF MVVM 中绑定(bind)到没有代理对象的派生属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com