C# 如何绑定到ListView中的属性以外的其他对象?
我正在开发一个抽认卡应用程序。我有这两种型号:甲板和卡片 甲板: 卡片: 在我的用户的HomeViewModel中,他们在listview中看到他们的组列表。在每一行中,他们会看到牌组的名称、牌组的数量,然后是一个按钮,该按钮具有研究、编辑或删除每个牌组的选项 我的问题是关于显示牌组的牌数。现在,我的HomeViewModel如下所示:C# 如何绑定到ListView中的属性以外的其他对象?,c#,wpf,xaml,mvvm,binding,C#,Wpf,Xaml,Mvvm,Binding,我正在开发一个抽认卡应用程序。我有这两种型号:甲板和卡片 甲板: 卡片: 在我的用户的HomeViewModel中,他们在listview中看到他们的组列表。在每一行中,他们会看到牌组的名称、牌组的数量,然后是一个按钮,该按钮具有研究、编辑或删除每个牌组的选项 我的问题是关于显示牌组的牌数。现在,我的HomeViewModel如下所示: public class HomeViewModel : BaseViewModel { private int _count;
public class HomeViewModel : BaseViewModel
{
private int _count;
public int Count
{
get
{
return _count;
}
set
{
_count = Count;
OnPropertyChanged("Count");
}
}
private readonly IDeckManager _deckManager;
public CreateDeckViewModel _createDeckViewModel { get; set; }
public ObservableCollection<Deck> Decks { get; set; }
public HomeViewModel(CreateDeckViewModel createDeckViewModel, IAuthenticator authenticator, IDeckManager deckManager)
{
//Decks = all of the current users decks
_deckManager = deckManager;
Decks = new ObservableCollection<Deck>
(_deckManager.getDecks(authenticator.CurrentUser.Id).Result);
//the result comes in, but I must be binding incorrectly
foreach (Deck deck in Decks)
{
Count = _deckManager.getCardCount(deck.Id).Result;
}
_createDeckViewModel = createDeckViewModel;
}
}
但由于这副牌并没有它拥有的牌数的属性,我不确定绑定到什么。这是我目前拥有的计数:
Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type viewModels:HomeViewModel}},
Path=Stuff, UpdateSourceTrigger=PropertyChanged, FallbackValue=500}"
我还尝试在foreach循环和转换器中使用当前组的Id调用getCardCount方法,但是转换器构造函数无法接受参数,因此无法接受我的IDeckManager实例,并且我无法使foreach循环工作
这里还有其他选择吗?提前感谢。由于您将数据组作为数据上下文,并且可以通过FindAncestor绑定到HomeViewModel,因此您可以使用IMultiValueConverter并将两者发送到它,进行所需的计算并返回卡数
public class DeckToCountConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int count = 0;
if(values.Length == 2 && values[0] is Deck && values[1] is HomeViewModel)
{
Deck deck = values[0] as Deck;
HomeViewModel vm = values[1] as HomeViewModel;
count = vm.GetCountByDeckId(deck.Id);
}
return count;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
由于您的IDeckManager是私有的,您可能需要将其公开,编写一个GetCountByDeckId方法(我在这里所做的),或者使用某种按id计数的字典(代码中的计数重新分配给count,因此它始终具有计算的最后一组的计数)
如果您需要多绑定到ListView的引用:
谢谢你的帮助。我不知道我可以将HomeViewModel(的实例?)发送到转换器。现在我正在为XAML语法而挣扎,我不确定它的路径应该是什么,因为它必须是一个绑定,尽管ID工作正常。现在,对于发送HomeViewModel,我有:
,因为我无法编辑我的上一条评论,我会说我将绑定更改为:
,我更接近了,我实际上在值[1]处得到了一个值,但它是作为相对资源对象的,所以我目前正在尝试弄清楚我的源代码是否有误。当我使用RelativeSource而不是Source时,我在转换器中得到一个空的PropertySource对象。假设HomeViewModel是window\usercontrol的dataContext,
应该适合您。。
Text="{Binding Path=Name}"
Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type viewModels:HomeViewModel}},
Path=Stuff, UpdateSourceTrigger=PropertyChanged, FallbackValue=500}"
public class DeckToCountConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int count = 0;
if(values.Length == 2 && values[0] is Deck && values[1] is HomeViewModel)
{
Deck deck = values[0] as Deck;
HomeViewModel vm = values[1] as HomeViewModel;
count = vm.GetCountByDeckId(deck.Id);
}
return count;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class HomeViewModel : INotifyPropertyChanged
{
...
public int GetCountByDeckId(int deckId)
{
return _deckManager.getCardCount(deckId).Result;
}
}