【问题标题】:Binding in xaml with a parameterized contructor使用参数化构造函数在 xaml 中绑定
【发布时间】:2014-08-24 21:31:08
【问题描述】:

我目前正在尝试使用参数化构造函数绑定到来自类的数据,但我无法弄清楚如何让 xaml 使用该构造函数而不是默认构造函数。我想要做的是将Gauge ControlValue 属性设置为等于GetDoDo method 中显示的IMobileServiceTableQuery 返回的条目数。

我的视图模型类 StatsViewModel 如下所示:

class StatsViewModel : BindableBase
{
    private int _value;

    // Default constructor
    public StatsViewModel() { }

    public StatsViewModel(int val)
    {
        _value = val;
    }

    public int Value {
        get { return _value; }
        set { this.SetProperty(ref _value, value); }
    }
}

然后在我的 xaml.cs 文件中,我有一个 GetToDo 方法,该方法在 Azure 中查询一个表并将视图模型中的 Value 属性设置为等于查询返回的行数:

private async void GetTodo()
{
    ImobileServiceTableQuery<int> query = taskTable
        .Where(t => t.Status == 1)
        .Select(t => t.Status);

    List<int> statusOne = await query.ToListAsync();

    int val = statusOne.Count;

    StatsViewModel stats = new StatsViewModel(val);

    /******************************************************************************
     * This is something I tried earlier but it didn't
     * work so I commented it out:
     *
     * Binding valueBinding = new Binding();
     * valueBinding.Source = stats;
     * BindingOperations.SetBinding(ToDoGauge, Gauge.ValueProperty, valueBinding);
     *
     * Was I on the right track here?
     *******************************************************************************/
}

最后,我的 xaml 中的相关代码如下所示:

<Page.Resources>
    ...
    <viewmodels:StatsViewModel x:Name="StatsViewModel" />
</Page.Resources>

...

<StackPanel>
    <TextBlock Text="To Do Items:" Style="{StaticResource HeaderTextBlockStyle}"/>
    <controls:Gauge
        x:Name="ToDoGauge"
        Minimum="0"
        Maximum="100"
        Height="200"
        Value="{Binding Value}"
        Unit="To Do" FontFamily="Global User Interface" />
</StackPanel>

我很确定这个问题与构造函数被参数化这一事实有关,因为当我单步执行代码时,我能够验证我在GetToDo() 中查询的列表中的项目数被分配准确到StatsViewModel 中的_value。我的想法是 xaml 代码只查看默认构造函数,看看那里没有定义任何内容并假设 Value 是一个空值。我不明白的是如何让xaml代码看到参数化构造函数中设置的_value的值。

提前感谢任何可以提供帮助的人。

【问题讨论】:

  • "can't get it to work" 是一个可怕的问题陈述。
  • 你的 ToDo() 与静态资源没有任何关系。
  • 好的,但是我应该在 StatsViewModel 类中做一些不同的事情还是应该在 ToDo 方法中设置绑定?这就是我包含它的原因。
  • 您仍然没有说明实际结果与预期结果,编辑并没有太大帮助。
  • Source={StaticResource 不会连接到您在 C# 中执行的任何操作。请参阅有关数据绑定的基本教程。

标签: c# xaml data-binding windows-store-apps viewmodel


【解决方案1】:

好的,所以我最终只是使用了一种解决方法,它带来了预期的结果,而没有真正解决在 xaml 中绑定到此数据的问题,但这就是我所做的:

private async void GetToDo()
{

    ...

    double value = Double(Parse(val.ToString());

    ToDoGauge.SetValue(Gauge.ValueProperty, value);

}

当我弄清楚如何使绑定正常工作时,我会为以后可能有类似问题的任何人编辑此答案。如果有人确实知道如何解决此问题,请随时发布 - 我很想看看一些替代解决方案是什么样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多