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本身更冗长)