gpt4 book ai didi

c# - 为什么我的 Silverlight XAML 绑定(bind)单元测试失败?

转载 作者:行者123 更新时间:2023-11-30 15:44:11 25 4
gpt4 key购买 nike

我定义了以下组合框:

<ComboBox x:Name="cmbCurrency" 
ItemsSource="{Binding IsoCurrenciesList}"
DisplayMemberPath="Description"
SelectedValuePath="LocaleID"
SelectedValue="{Binding CurrencyId, Mode=TwoWay">
</ComboBox>

在哪里IsoCurrenciesList是一个 IEnumerable<IsoCurrency> - 由我们定义并在 View 模型中声明为的类型:

private IEnumerable<IsoCurrency> isoCurrenciesList;
public IEnumerable<IsoCurrency> IsoCurrenciesList
{
get { return isoCurrenciesList; }
set
{
isoCurrenciesList = value;
RaisePropertyChangedEvent("IsoCurrenciesList");
}
}

我的单元测试创​​建了 View 和 View 模型的实例,并在本地列表中设置了一些虚拟货币数据:

[TestInitialize]
public void TestInit()
{
_target = new View();

_viewModel = new ViewModel();

var ukp = new IsoCurrency { Code = "GBP", Description = "Pound Sterling", LocaleID = 826 };
var usd = new IsoCurrency { Code = "USD", Description = "US Dollar", LocaleID = 840 };
var eur = new IsoCurrency { Code = "EUR", Description = "Euro", LocaleID = 978 };
_currencies = new List<IsoCurrency> { ukp, usd, eur };

GetUIElement<Grid>("LayoutRoot").DataContext = _viewModel;
}

private T GetUIElement<T>(string name) where T : UIElement
{
return (T)_target.FindName(name);
}

然后调用测试方法。这应该设置货币 ComboBox.Items (通过 ItemsSource 属性)

[Asynchronous]
[TestMethod]
public void TestCurrencySelection()
{
_target.Loaded += (s, e) =>
{
// Set the currency list explicitly
_viewModel.IsoCurrenciesList = _currencies;

var currencyCombo = GetUIElement<ComboBox>("cmbCurrency");
// This assert fails as Items.Count == 0
CollectionAssert.AreEquivalent(currencyCombo.Items, _currencies, "Failed to data-bind currencies.");

EnqueueTestComplete();
};

TestPanel.Children.Add(_target);
}

我已遵循 Jeremy Likeness's blog 上的指南但我无法通过绑定(bind)测试。

我已经尝试测试其他属性的绑定(bind) - 简单的字符串、 bool 值和整数,但在任何一端所做的更改都不会反射(reflect)到另一端。

我唯一能想到的是,在将 View 添加到 TestPanel 之后我还需要做一个步骤。 “激活”绑定(bind),但我不知道它可能是什么。

更新

我应该指出代码在实际应用中运行良好。根据评论(尤其是来自 Adam Sills 的评论),问题似乎出在我没有发布的代码中 - 也就是说,这是我们构造 XAML 的方式或在我们设置 DataContext 的方式.至少我可以(希望)将精力集中在正确的领域。

看来控件在 View 中的位置确实很重要。页面 XAML 是这样的:

<Grid x:Name="LayoutRoot">
<VisualStateManager.VisualStateGroups>
...
</VisualStateManager.VisualStateGroups>

<toolkit:BusyIndicator x:Name="activityControl"
IsBusy="{Binding IsBusy}"
BusyContent="{Binding BusyContent}" >
<Grid>
... The page definition including sub grids, stack panels
and the combo box I'm testing along with other controls

<ops:SaveConfirmation Grid.Row="1" Margin="5"
x:Name="saveConfirmation"
SavedState="{Binding VendorSaved, Mode=TwoWay}" />
</Grid>
</toolkit:BusyIndicator/>
</Grid>

BusyIndicator是来自 Silverlight Toolkit 和 SaveConfirmation 的一个是我们编写的控件。

如果我测试 IsBusyBusyIndicator 上绑定(bind)按预期工作。但是,如果我测试 SavedStateSaveConfirmation 上绑定(bind)失败了——我设置了 VendorSaved属性在测试中为 true,但当我获得控件时,绑定(bind)值为 false。

var busyIndicator = GetUIElement<BusyIndicator>("activityControl");
Assert.AreEqual(busyIndicator.IsBusy, _viewModel.IsBusy, "Failed to data-bind busy indicator.");

var saveConfirmation = GetUIElement<SaveConfirmation>("saveConfirmation");
Assert.AreEqual(saveConfirmation.SavedState, _viewModel.VendorSaved, "Failed to data-bind saved state");

所以第一个测试通过,但第二个测试失败。

我需要做什么来确保元素的绑定(bind)一直到树下都已设置好?

最佳答案

我的猜测是因为您在 Loaded 处理程序中执行 _viewModel.IsoCurrenciesList = _currencies; 而不是像博客中的示例那样填充现有的 ObservableCollection 属性。在 Dispatcher 上的当前调用完成之前,绑定(bind)可能不会更新。尽管我对 Silverlight 还不够熟悉,所以不能肯定地说。

要对此进行测试,您可以在将 viewModel 设置为控件上的 DataContext 之前尝试设置 _viewModel.IsoCurrenciesList

关于c# - 为什么我的 Silverlight XAML 绑定(bind)单元测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6217435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com