Xaml Xamarin-ProgressBar结合

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;} } 项目模板弹出窗口为: <

我有一个页面,其中有一个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;}
}
项目模板弹出窗口为:

<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;
    }
}