当 itemSource 绑定到模型 (\

问题描述

我有一个包含 ListView 的 UserControl(视图)。 itemsSource 绑定到 Model Character.cs。我将 ListView.ItemTemplate 设置为另一个视图,在该视图中,该视图是 3 个字符串的位置和一个用于选择字符的按钮。这三个字符串需要填充来自模型的数据(已完成),但按钮的命令需要绑定到 viewmodel 中的 ICommand。我无法访问此命令,因为 itemsSource 绑定到一个字符,它将带有按钮的视图的 dataContext 设置为一个字符。

这是具有 ListView 的 UserControl(视图)

<Grid>

    <Grid.ColumnDeFinitions>
        <ColumnDeFinition Width="*"/>
    </Grid.ColumnDeFinitions>

    <!--disable the selected item thingyyy??-->
    <ListView ItemsSource="{Binding Characters}"  
                  SelectedItem="{Binding CharacterItemVM.BoundCharacter}"
                  Background="{StaticResource BackGroundColorDark}"
                  HorizontalContentAlignment="Stretch">
        <ListView.ItemTemplate>
            <DataTemplate>
                <v:CharacterItemView Grid.Column="0"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</Grid>

这是具有 3 个字符串和一个按钮的视图

<Grid Background="{StadticResource BackGroundColor}">
    <Grid.ColumnDeFinitions>
        <ColumnDeFinition/>
        <ColumnDeFinition/>
        <ColumnDeFinition/>
        <ColumnDeFinition/>
    </Grid.ColumnDeFinitions>

    <Border Grid.Column="0" BorderBrush="white" BorderThickness="0,3,0"/>
    <Border Grid.Column="1" BorderBrush="white" BorderThickness="0,0"/>
    <Border Grid.Column="2" BorderBrush="white" BorderThickness="0,0"/>

    <Label FontSize="18" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" 
           Content="{Binding Name,FallbackValue=N/A}"/>
    <Label FontSize="18" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"  
           Content="{Binding CharacterClass,FallbackValue=N/A}"/>
    <Label FontSize="18" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"  
           Content="{Binding Level,FallbackValue=N/A}"/>

    <Button Content="select" FontSize="18" Grid.Column="3" Background="DarkGray" 
            Foreground="white" BorderThickness="3" BorderBrush="LightCyan"
            Margin="15" Command="{Binding SelectCharacterCommand}"/>
</Grid>

这是带有 3 个按钮的 View 的 viewmodel

public class CharacterItemviewmodel : ObservableObject
{

    private Character boundCharacter;
    public Character BoundCharacter
    {
        get { return boundCharacter; }
        set { OnPropertyChaged(ref boundCharacter,value); }
    }

    ICommand SelectCharacterCommand;

    //Todo: get the characterStore from BookVM
    public CharacterItemviewmodel(CharacterStore characterStore)
    {
        SelectCharacterCommand = new SelectCharacterCommand(characterStore,this,boundCharacter);
    }

}

我希望按钮使用 CharacterItemviewmodel 类中的 SelectCharacterCommand。您如何建议我更改代码以实现这一目标,同时仍然坚持 MVVM 原则? 谢谢!

解决方法

好的,我知道了!昨天挣扎了几个小时然后今天寻求帮助......然后在 5 分钟后想通了:/

将 ItemsSource 绑定到 ObserbableCollection。这是在 LoadCharacters() 方法中。

public class CharacterListViewModel : ObservableObject
{
    private ICharacterDataService dataService;

    private readonly CharacterStore characterStore;

    private CharacterItemViewModel characterItemVM;
    public CharacterItemViewModel CharacterItemVM
    {
        get { return characterItemVM; }
        set { OnPropertyChaged(ref characterItemVM,value); }
    }


    // ObservableCollection is a wpf friendly list
    public static ObservableCollection<Character> Characters { get; private set; }
    public ObservableCollection<CharacterItemViewModel> CharacterItems { get; private set; }

    // call this to load the characters in the UI
    public ICommand LoadCharactersCommand { get; private set; }

    public CharacterListViewModel(MockDataService dataService,CharacterStore _characterStore)
    {
        characterItemVM = new CharacterItemViewModel(characterStore,new Character("","",""));

        characterStore = _characterStore;
        this.dataService = dataService;

        LoadCharactersCommand = new RelayCommand(LoadCharacters);
        LoadCharacters();

    }

    public void LoadCharacters()
    {
        //CharacterItemVM.LoadCharacters(dataService.GetCharacters());
        Characters = new ObservableCollection<Character>(dataService.GetCharacters());

        CharacterItems = new ObservableCollection<CharacterItemViewModel>();

        Character[] characterArray = Characters.ToArray();


        for(int i = 0; i < Characters.Count - 1; i++)
        {
            CharacterItems.Add(new CharacterItemViewModel(characterStore,characterArray[i]));
        }

        OnPropertyChaged("Characters");
    }


} // class

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...