Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# CollectionView更新图像按钮滚动重复UI问题_C#_Xamarin_Xamarin.forms_Xamarin.forms.collectionview - Fatal编程技术网

C# CollectionView更新图像按钮滚动重复UI问题

C# CollectionView更新图像按钮滚动重复UI问题,c#,xamarin,xamarin.forms,xamarin.forms.collectionview,C#,Xamarin,Xamarin.forms,Xamarin.forms.collectionview,我有一个CollectionView包含一个ImageButton。按下图像时,我将a.png替换为b.png 这很好,但当我向下滚动列表时,每10个项目都会显示b.png 如果我没有设置按钮.source,而是在保存到DB后再次调用下面的行,这解决了我的问题,但我从列表的顶部开始,而不是从当前位置开始: ItemsListView.ItemsSource = items; 如何设置按钮.source而不在每10项中创建此错误 <CollectionView x:Name=&qu

我有一个
CollectionView
包含一个
ImageButton
。按下图像时,我将a.png替换为b.png

这很好,但当我向下滚动列表时,每10个项目都会显示b.png

如果我没有设置
按钮.source
,而是在保存到DB后再次调用下面的行,这解决了我的问题,但我从列表的顶部开始,而不是从当前位置开始:

ItemsListView.ItemsSource = items;
如何设置
按钮.source
而不在每10项中创建此错误

    <CollectionView x:Name="Items">
                <CollectionView.ItemTemplate>
                        <DataTemplate>
                           <ImageButton CommandParameter="{Binding Id}" Source="a.png" Clicked="OnInventoryClicked" />
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
    </CollectionView>

您可以使用souce属性进行更改

Xaml:


代码隐藏:

public partial class MainPage : ContentPage
{

    public ObservableCollection<Info> infos { get; set; }
    public MainPage()
    {
        InitializeComponent();
        infos = new ObservableCollection<Info>()
        {
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },

        };


        this.BindingContext = this;
    }

    private void ImageButton_Clicked(object sender, EventArgs e)
    {
        var button = (sender as ImageButton);
        button.Source = "dog.jpg";
    }


}
public class Info
{
    public string image { get; set; }
}
public分部类主页面:ContentPage
{
公共可观测集合信息{get;set;}
公共主页()
{
初始化组件();
infos=新的ObservableCollection()
{
新信息{image=“pink.jpg”},
新信息{image=“pink.jpg”},
新信息{image=“pink.jpg”},
新信息{image=“pink.jpg”},
新信息{image=“pink.jpg”},
};
this.BindingContext=this;
}
已单击私有无效图像按钮(对象发送者,事件参数e)
{
var按钮=(发送方为ImageButton);
button.Source=“dog.jpg”;
}
}
公共类信息
{
公共字符串图像{get;set;}
}

附带问题:CommandParameter是否应该仅与Command一起使用(不查看Command)?与其直接修改图像源,不如尝试将其绑定到模型属性。因此,您不需要每次都加载该项。您已经有一个绑定到当前单元格的副本,只需使用该副本并为自己保存一个db操作谢谢,这是我的第一个Xamarin应用程序,因此我需要阅读更多教程,但它现在正在图像源上添加绑定。如何进行重构以删除CommandParameter并删除“get DB call”,同时仍然能够获得要传递给“save DB call”的完整对象?
CommandParameter=“{Binding.}”
将传递整个对象,而不仅仅是ID
<CollectionView x:Name="Items" ItemsSource="{Binding infos}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <!--<ImageButton
                Clicked="OnInventoryClicked"
                CommandParameter="{Binding Id}"
                Source="a.png" />-->
            <ImageButton Clicked="ImageButton_Clicked" Source="{Binding image}" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>
public partial class MainPage : ContentPage
{

    public ObservableCollection<Info> infos { get; set; }
    public MainPage()
    {
        InitializeComponent();
        infos = new ObservableCollection<Info>()
        {
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },
            new Info{image = "pink.jpg"        },

        };


        this.BindingContext = this;
    }

    private void ImageButton_Clicked(object sender, EventArgs e)
    {
        var button = (sender as ImageButton);
        button.Source = "dog.jpg";
    }


}
public class Info
{
    public string image { get; set; }
}