- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 MvxSpinner 在 MvvmCross for Xamarin 应用程序的组合框中显示国家/地区电话前缀。我可以正确地绑定(bind)到 ItemsSource 属性,所以我可以看到我的前缀列表,但是当我在我的 View 模型中分配绑定(bind)到 MvxSpinner 的 SelectedItem 属性的属性时,它将不起作用并且将始终显示第一个列表中的元素作为所选项目。
我的做法如下。在我的 ViewModel 中,我从服务器获取用户数据并分配 Country 和 PhonePrefix 的属性。然后我也从服务器获取所有国家和前缀的列表,并将它们绑定(bind)到列表属性,这些属性绑定(bind)到相应的 MvxSpinners 的 ItemSource 属性(简化):
public string PhonePrefix { get; set; }
public string PhoneNumber { get; set; }
public Country Country { get; set; } = new Country();
public List<Country> Countries { get; set; } = new List<Country>();
public List<string> Prefixes { get; set; } = new List<string>();
private async Task GetUserData()
{
try
{
var userDataResult = await _registrationService.GetLoggedInUserData();
if (userDataResult != null)
{
if (!userDataResult.HTTPStatusCode.Equals(HttpStatusCode.OK))
{
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert(userDataResult.Error?.Message);
}
else
{
PhonePrefix = userDataResult.user.country_code_phone;
PhoneNumber = userDataResult.user.phone;
Country.id = userDataResult.user.person.addresses[0].country_id;
Country.name = userDataResult.user.person.addresses[0].country_name;
}
}
}
catch (Exception e)
{
Log.Error<RegistrationViewModel>("GetUserData", e);
}
}
/// <summary>
/// Populates the view model properties for Countries and Prefixes with information retrieved from the server
/// </summary>
private void ProcessFormData()
{
if (_registrationFormData != null)
{
Countries = _registrationFormData.Countries?.ToList();
var userCountry = Countries?.Where(c => c.id == Country?.id).FirstOrDefault();
Country = IsUserLogedIn && Country != null ? userCountry : Countries?[0];
var prefixes = new List<string>();
if (Countries != null)
{
foreach (var country in Countries)
{
//spinner binding doesn't allow null values
if (country.phone_prefix != null)
{
prefixes.Add(country.phone_prefix);
}
}
}
//we need to assign the binded Prefixes at once otherwise the binding for the ItemSource fails
Prefixes = prefixes;
PhonePrefix = Prefixes.Count > 0 && !IsUserLogedIn && string.IsNullOrWhiteSpace(PhonePrefix) ? Prefixes?[0] : PhonePrefix;
}
}
在 axml 布局中:
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrCountry"
local:MvxBind="ItemsSource Countries; SelectedItem Country"/>
<MvxSpinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:layout_marginBottom="10dp"
android:id="@+id/spnrPrefix"
local:MvxBind="ItemsSource Prefixes; SelectedItem PhonePrefix"/>
在输出窗口中,我可以看到有关 MvxBinding 的以下错误:
(MvxBind) Null values not permitted in spinner SelectedItem binding currently
我进行了调试,但我在列表或绑定(bind)到 MvxSpinner 的 ItemSource 和 SelectedItem 属性的属性中从来没有任何 Null 值。
实际上,Countries ItemSource 和 SelectedItem 可以正常工作,因此如果用户将其所在国家/地区保存为 Argentina,当我加载它的数据时,微调器中的选定项目将是 Argentina。请注意,我使用了这样的 Country 实体:
public class Country
{
public int id { get; set; }
public bool favorite { get; set; }
public string name { get; set; }
public string name_de { get; set; }
public string code { get; set; }
public int rzl_code { get; set; }
public string phone_prefix { get; set; }
public string updated_at { get; set; }
public string created_at { get; set; }
public override string ToString()
{
return name;
}
}
我还尝试在它自己的实体中使用电话前缀来包装一个字符串值,但它也没有用。
有人知道我做错了什么吗?为什么它对国家有效而对前缀无效?
我使用 PropertyChanged.Fody。
谢谢!
最佳答案
关于 null
的错误是因为微调器中的 SelectedItem
不允许将 null
作为选定项。因此,如果您想显示一个空项目,一种解决方案是添加另一个具有空值的固定项目,即在 PhonePrefix
的情况下,您可以设置 string.Empty
和将它添加到 PhonePrefixes
列表中,在您的 Country
中,您可以将第一个设置为默认值或创建一个名为 的 stub
例如并将其添加到国家/地区列表。Country
None
要考虑的另一点是,当您想要更新 View 时,您必须确保在主线程中通知它。您正在尝试更新另一个线程的 Task
中的 PhonePrefix
,这样 View 就不会被注意到。
您应该通过以下方式更新 PhonePrefix
:
this.InvokeOnMainThread(() => PhonePrefix = userDataResult.user.country_code_phone;
);
这将负责直接在主线程上执行 PhonePrefix
集,以便正确通知您的 View 。
更新
在更好地查看您的问题和自己的答案并看到您使用 PropertyChanged.Fody
之后,我可以猜测问题实际上是您如何分配 PhonePrefix
。
PropertyChanged.Fody
默认行为是添加 Equality Checking替换您的属性代码
public string PhonePrefix { get; set; }
对于类似的东西
private string _phonePrefix;
public string PhonePrefix
{
get
{
return _phonePrefix;
}
set
{
if (!String.Equals(_phonePrefix, value))
{
_phonePrefix = value;
OnPropertyChanged("PhonePrefix");
}
}
}
所以当您在 GetUserData()
中执行操作时:
PhonePrefix = userDataResult.user.country_code_phone;
并在 ProcessFormData()
PhonePrefix = Prefixes.Count > 0 && !IsUserLogedIn && string.IsNullOrWhiteSpace(PhonePrefix) ? Prefixes?[0] : PhonePrefix;
PhonePrefix
不是 null 或空白,因此它尝试重新分配相同的值,但因为 fody 添加了相等性检查,它不会再次分配,因此它不会引发值的变化,所以该 View 不会收到通知。
GetUserData()
中的分配我认为它可能在另一个线程中完成,这就是为什么 View 没有得到通知的原因。根据你所说的,Country
确实在 ProcessFormData()
中得到更新,所以为了 PhonePrefix
在那个地方也被更新,你应该只添加属性的 [DoNotCheckEquality]
属性以避免相等性检查,这应该是全部。
[DoNotCheckEquality]
public string PhonePrefix { get; set; }
如果它不起作用,您也应该在主线程上添加调用(我建议您在调试中查看正在执行的方法是在哪个线程上,以查看您是否确实需要在主线程上调用)。
高
关于c# - 绑定(bind)到 MvxSpinner SelectedItem 属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408601/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!