Xaml Xamarin-ProgressBar结合
我有一个页面,其中有一个cardview BadgeView.cs的C#代码(BadgeView XAML具有名为card的stacklayout): 卡片视图项目源设置为具有此模型的徽章对象列表:Xaml Xamarin-ProgressBar结合,xaml,xamarin,mvvm,progress-bar,Xaml,Xamarin,Mvvm,Progress Bar,我有一个页面,其中有一个cardview BadgeView.cs的C#代码(BadgeView XAML具有名为card的stacklayout): 卡片视图项目源设置为具有此模型的徽章对象列表: public class badge { string Name {get;set;} string Description {get;set;} int CurrentProgress {get;set;} int GoalProgress {get;set;} } 项目模板弹出窗口为: <
public class badge {
string Name {get;set;}
string Description {get;set;}
int CurrentProgress {get;set;}
int GoalProgress {get;set;}
}
项目模板弹出窗口为:
<StackLayout
Orientation="Vertical"
HorizontalOptions="Center"
VerticalOptions="Start"
Padding="5"
BackgroundColor="Goldenrod">
<StackLayout.Resources>
<ResourceDictionary>
<local:ProgressConverter x:Key="xprogress" xCurrentProgress="{Binding CurrentProgress}"
xGoalProgress="{Binding GoalProgress}"/>
</ResourceDictionary>
</StackLayout.Resources>
<StackLayout Orientation="Vertical">
<Label Text="{Binding Title}"></Label>
<Label Text="{Binding Description}"></Label>
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Name}"></Label>
<ProgressBar x:Name="Progressbar" ProgressColor="Purple"
Progress="{Binding Converter={StaticResource xprogress}}">
</ProgressBar>
<Label Text="{Binding Description}"></Label>
</StackLayout>
</StackLayout>
这对我来说很有用:
<local:ProgressConverter x:Key="xprogress" xCurrentProgress="2"
xGoalProgress="3"/>
有什么建议吗?也许您误解了
IValueConverter
和ViewModel的使用。如果要绑定数据,则需要创建ViewModel来绑定数据。如果要转换值,首先需要绑定一个数据源,然后绑定一个值转换器来转换数据源的参数
数据绑定通常将数据从源属性传输到目标属性,有时从目标属性传输到源属性
从代码中只绑定一个IValueConverter
,这将不起作用
下面是一个关于使用视图模型的示例:
public class ProgresssModel : INotifyPropertyChanged
{
private int currentprogressvalue;
public int CurrentProgressValue
{
set
{
if (currentprogressvalue != value)
{
currentprogressvalue = value;
OnPropertyChanged("ProgressValue");
progressvalue = (double)currentprogressvalue / totalprogressvalue;
}
}
get
{
return currentprogressvalue;
}
}
private int totalprogressvalue;
public int TotalProgressValue
{
set
{
if (totalprogressvalue != value)
{
totalprogressvalue = value;
OnPropertyChanged("ProgressValue");
progressvalue = (double)currentprogressvalue / totalprogressvalue;
}
}
get
{
return totalprogressvalue;
}
}
private double progressvalue;
public double ProgressValue
{
set
{
if (progressvalue != value)
{
progressvalue = value;
OnPropertyChanged("ProgressValue");
}
}
get
{
return progressvalue;
}
}
public ProgresssModel()
{
currentprogressvalue = 30;
totalprogressvalue = 100;
progressvalue = (double)currentprogressvalue / totalprogressvalue;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class SecondPage : ContentPage
{
ProgresssModel progresssModel;
public SecondPage()
{
InitializeComponent();
progresssModel = new ProgresssModel();
myprogress.BindingContext = progresssModel;
}
private void Button_Clicked(object sender, EventArgs e)
{
progresssModel.CurrentProgressValue = 40;
progresssModel.TotalProgressValue = 100;
}
}
在XAML中,添加非自定义的ProgressBar
,并添加按钮以显示更改的数据
例如,当运行时:
<StackLayout BackgroundColor="WhiteSmoke" Padding="20">
<Label Text="Welcome to Xamarin.Forms!"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
<ProgressBar x:Name="myprogress" Progress="{Binding ProgressValue}"/>
<Button Text="change" Clicked="Button_Clicked"/>
</StackLayout>
效果:
public class ProgresssModel : INotifyPropertyChanged
{
private int currentprogressvalue;
public int CurrentProgressValue
{
set
{
if (currentprogressvalue != value)
{
currentprogressvalue = value;
OnPropertyChanged("ProgressValue");
progressvalue = (double)currentprogressvalue / totalprogressvalue;
}
}
get
{
return currentprogressvalue;
}
}
private int totalprogressvalue;
public int TotalProgressValue
{
set
{
if (totalprogressvalue != value)
{
totalprogressvalue = value;
OnPropertyChanged("ProgressValue");
progressvalue = (double)currentprogressvalue / totalprogressvalue;
}
}
get
{
return totalprogressvalue;
}
}
private double progressvalue;
public double ProgressValue
{
set
{
if (progressvalue != value)
{
progressvalue = value;
OnPropertyChanged("ProgressValue");
}
}
get
{
return progressvalue;
}
}
public ProgresssModel()
{
currentprogressvalue = 30;
totalprogressvalue = 100;
progressvalue = (double)currentprogressvalue / totalprogressvalue;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class SecondPage : ContentPage
{
ProgresssModel progresssModel;
public SecondPage()
{
InitializeComponent();
progresssModel = new ProgresssModel();
myprogress.BindingContext = progresssModel;
}
private void Button_Clicked(object sender, EventArgs e)
{
progresssModel.CurrentProgressValue = 40;
progresssModel.TotalProgressValue = 100;
}
}
提供完整的代码或示例,以便人们能够更好地帮助您。@LucasZhang MSFT谢谢,刚刚编辑并添加了示例代码。我会尝试一下。。但是在ProgressModel和按钮中,值都设置为30、40和100。。。如何从其父元素(cardView)获取其值ItemSource@user2596181您可以将ProgressModel
设置为静态实例。由cardView的ItemSource中的其他元素更新。我知道如何从xaml访问ItemSource数据,如下所示:描述是badge对象中的字符串。但是我不知道如何从C中的代码访问它#你能举个例子吗?@user2596181好的,例如:label.SetBinding(label.TextProperty,newprogressmodel().TextValue)代码>此示例设置标签的绑定。我的意思是我已经有了一个带有itemsource和itemTemplate的cardView,itemTemplate有progressbar,progressbar从cardView itemsource中获取两个值并将它们分开。我可以像这样为进度条设置一个值:但我不知道如何划分CurrentProgress和GoalProgress,并将进度条进度设置为结果。我希望我说得更清楚。
<StackLayout BackgroundColor="WhiteSmoke" Padding="20">
<Label Text="Welcome to Xamarin.Forms!"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
<ProgressBar x:Name="myprogress" Progress="{Binding ProgressValue}"/>
<Button Text="change" Clicked="Button_Clicked"/>
</StackLayout>
public partial class SecondPage : ContentPage
{
ProgresssModel progresssModel;
public SecondPage()
{
InitializeComponent();
progresssModel = new ProgresssModel();
myprogress.BindingContext = progresssModel;
}
private void Button_Clicked(object sender, EventArgs e)
{
progresssModel.CurrentProgressValue = 40;
progresssModel.TotalProgressValue = 100;
}
}