Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何绑定到ListView中的属性以外的其他对象?_C#_Wpf_Xaml_Mvvm_Binding - Fatal编程技术网

C# 如何绑定到ListView中的属性以外的其他对象?

C# 如何绑定到ListView中的属性以外的其他对象?,c#,wpf,xaml,mvvm,binding,C#,Wpf,Xaml,Mvvm,Binding,我正在开发一个抽认卡应用程序。我有这两种型号:甲板和卡片 甲板: 卡片: 在我的用户的HomeViewModel中,他们在listview中看到他们的组列表。在每一行中,他们会看到牌组的名称、牌组的数量,然后是一个按钮,该按钮具有研究、编辑或删除每个牌组的选项 我的问题是关于显示牌组的牌数。现在,我的HomeViewModel如下所示: public class HomeViewModel : BaseViewModel { private int _count;

我正在开发一个抽认卡应用程序。我有这两种型号:甲板和卡片

甲板:

卡片:

在我的用户的HomeViewModel中,他们在listview中看到他们的组列表。在每一行中,他们会看到牌组的名称、牌组的数量,然后是一个按钮,该按钮具有研究、编辑或删除每个牌组的选项

我的问题是关于显示牌组的牌数。现在,我的HomeViewModel如下所示:

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;
    }
}