Wpf 如何绑定每个按钮';从ListView到observable集合的单个项目的图像源?

Wpf 如何绑定每个按钮';从ListView到observable集合的单个项目的图像源?,wpf,xaml,Wpf,Xaml,我有如下按钮的列表视图: <ListView ItemsSource="{Binding TestList}"> <ListViewItem > <ListView.ItemTemplate> <DataTemplate> <Button Name="test" Grid.Row="0" Grid.Column="10" Grid.Column

我有如下按钮的列表视图:

<ListView ItemsSource="{Binding TestList}">
     <ListViewItem >
         <ListView.ItemTemplate>
                <DataTemplate>
                    <Button Name="test" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlignment="Center" Background="Transparent">
                        <Button.Template>
                             <ControlTemplate>
                                  <Grid>
                                      <Image Source="?????????????????????????????????????????????"/>
                                  </Grid>
                               </ControlTemplate>
                       </Button.Template>
                    </Button>
  </ListView.ItemTemplate>
public class CodeBehind
 {

        private ObservableCollection<string> testList;
        public ObservableCollection<string> TestList 
        {
            get { return testList; }
            set 
            { 
                testList = value;
            }
        } 



        public CodeBehind()
        {

            dummyModelList = new ObservableCollection<string>() { "/Assets/Image1", "/Assets/Image2", "/Assets/Image3"};


        }


}

后面的代码是这样的:

<ListView ItemsSource="{Binding TestList}">
     <ListViewItem >
         <ListView.ItemTemplate>
                <DataTemplate>
                    <Button Name="test" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlignment="Center" Background="Transparent">
                        <Button.Template>
                             <ControlTemplate>
                                  <Grid>
                                      <Image Source="?????????????????????????????????????????????"/>
                                  </Grid>
                               </ControlTemplate>
                       </Button.Template>
                    </Button>
  </ListView.ItemTemplate>
public class CodeBehind
 {

        private ObservableCollection<string> testList;
        public ObservableCollection<string> TestList 
        {
            get { return testList; }
            set 
            { 
                testList = value;
            }
        } 



        public CodeBehind()
        {

            dummyModelList = new ObservableCollection<string>() { "/Assets/Image1", "/Assets/Image2", "/Assets/Image3"};


        }


}
公共类代码隐藏
{
私有可观察收集测试列表;
公共ObservableCollection测试列表
{
获取{return testList;}
设置
{ 
testList=值;
}
} 
公共代码隐藏()
{
dummyModelList=newobserveCollection(){“/Assets/Image1”、“/Assets/Image2”、“/Assets/Image3”};
}
}

如何将每个按钮的图像源绑定到可观察集合中的单个项目?我只想在XAML中执行此操作。

您应该创建一个
数据模板
,以显示
列表视图的
项目模板
中的任何控件:

<ListView Name="listView">
   <ListView.ItemTemplate>
      <DataTemplate>
         <Grid Margin="2">
            <Grid.RowDefinitions>
              <RowDefinition Height="Auto*"/>
              <RowDefinition Height="Auto*"/>
            </Grid.RowDefinitions>
           <Button>           
              <Image Source="{Binding AddressImage}" Width="20" Grid.Row="0" />
           </Button>
           <TextBlock Grid.Row="1" TextAlignment="Left" FontWeight="Light"
                        VerticalAlignment="Center" Text="{Binding UserName}" />
         </Grid>
    </DataTemplate>
</ListView.ItemTemplate>
代码隐藏:

public MainWindow()
{
   PopulateCollection();
}

private void PopulateCollection()
{
    ObservableCollection<Person> personColl = new ObservableCollection<Person>();
    for (int i = 0; i <= 10; i++)
    {
         //here you can set any image what you want
         personColl.Add(new Person() { IdUser=i, UserName="I am " + i.ToString(), 
                    AddressImage="Assets/1.png"});
         //Assets is a folder with images
    }
    listView.ItemsSource=personColl;
}
public主窗口()
{
PopulateCollection();
}
私有void PopulateCollection()
{
ObservableCollection personColl=新的ObservableCollection();

for(int i=0;i您要查找的是(获取或设置用于显示每个项目的数据模板),而不是按钮的模板本身

您可以使用ItemTemplate指定数据对象的可视化。如果ItemsControl绑定到集合对象,并且您没有使用DataTemplate提供特定的显示说明,则每个项的结果UI都是基础集合中每个对象的字符串表示形式

因此,当您将ItemTemplate设置为DataTemplate的实例时,DataTemplate将用于呈现项。DataTemplate的DataContext将隐式设置为绑定集合中的单个项,因此您可以使用
{Binding.}
{Binding}将
图像.Source
绑定到DataContext本身

<ListView ItemsSource="{Binding TestList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Button Name="test" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlignment="Center" Background="Transparent">
                   <Image Source="{Binding .}" />
              </Button>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>


如果您已经在使用它,
{Binding.}
{Binding}
将起作用,因为您将绑定到字符串本身的
DataContext
。您不能这样做。如果您有两个按钮分别显示不同的图像,我建议您更改您的observable collection->
observable collection
其中
SomeModelClass
将包含两个图像的属性路径。哦,我看不出视图了解模型有任何问题。视图的目的是显示逻辑。视图了解任何有关viewmodel或model的信息都不会妨碍单元测试。我的MVVM方法是视图可以了解model和viewmodel,但viewmodel和model不应该了解view。model不应该了解view模型,但viewmodel可以了解模型。我不知道您的情况,但我实现了OnPropertyChanged(对于模型)的大部分时间。它只有3-4行。因此模型与所有东西都是解耦的。如果你不想这样,你可以始终使用viewmodel来包装模型,但我认为这太过分了,因为我们除了遵循类似MVVM的宗教:p(这也比实现INotifyPropertyChanged本身更冗长)