- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在将 Android.Support.V7.Widget.SwitchCompat
绑定(bind)到我的 View 模型时遇到了麻烦(Mvvmcross 是我正在使用的框架)我做了与在另一个对象上单击绑定(bind)完全相同的操作,效果非常好。
我在查看 View 时遇到的错误如下:
12-21 10:32:06.459 I/MvxBind (22969): 42,82 Failed to create target binding for binding CheckedChange for OnCheckedChanged
[0:] MvxBind:Warning: 42,82 Failed to create target binding for binding CheckedChange for OnCheckedChanged
我拥有的开关数量的多倍。
他们说它可能必须对链接器做一些事情,因为反射魔术不包括东西。
这样他们说你必须创建一个文件“LinkerPleaseInclude”来保持对你的switchcompat的引用。我这样做了,但错误仍然存在。
LinkerPleaseInclude
class LinkerPleaseInclude
{
public void Include(TextView text)
{
text.AfterTextChanged += (sender, args) => text.Text = "" + text.Text;
text.Hint = "" + text.Hint;
}
public void Include(CompoundButton cb)
{
cb.CheckedChange += (sender, args) => cb.Checked = !cb.Checked;
cb.Hint = "" + cb.Hint;
}
public void Include(SwitchCompat cb)
{
cb.CheckedChange += (sender, args) => cb.Checked = !cb.Checked;
cb.Hint = "" + cb.Hint;
}
public void Include(ICommand command)
{
command.CanExecuteChanged += (s, e) => { if (command.CanExecute(null)) command.Execute(null); };
}
public void Include(CheckBox checkBox)
{
checkBox.CheckedChange += (sender, args) => checkBox.Checked = !checkBox.Checked;
}
}
我的 View 布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="@dimen/md_list_single_line_item_height"
android:gravity="center_vertical"
android:paddingLeft="@dimen/md_list_item_horizontal_edges_padding"
android:paddingRight="@dimen/md_list_item_horizontal_edges_padding">
<android.support.v7.widget.SwitchCompat
android:id="@+id/mySwitch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
local:MvxBind="Checked IsActive; Click OnSwitchClick; CheckedChange OnCheckedChanged" />
<TextView
android:id="@+id/Name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:textColor="@color/md_text_dark_primary_87"
android:textSize="@dimen/md_list_item_primary_text"
local:MvxBind="Text Name"/>
<TextView
android:id="@+id/Kind"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:textColor="@color/md_text_dark_secondary_54"
android:textSize="@dimen/md_list_item_secondary_text"
android:layout_below="@+id/Name"
local:MvxBind="Text Kind"/>
</RelativeLayout>
此布局是另一个布局的子布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="@dimen/md_list_two_line_item_height"
android:paddingTop="?android:attr/actionBarSize"
android:fitsSystemWindows="true">
<MvxClickableLinearLayout
android:id="@+id/animalSelectionsList"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:divider="@drawable/divider_horizontal"
android:showDividers="middle"
local:MvxBind="ItemsSource SelectionsList"
local:MvxItemTemplate="@layout/listitem_animal_selections" />
</LinearLayout>
最佳答案
CheckedChange
是一个事件,因此它不是公共(public)属性。您不能直接在 MvvmCross 中绑定(bind)事件,除非您创建自己的目标绑定(bind)来处理此事件并公开命令。
这看起来像:
public class MvxCompoundButtonCheckedChangeBinding : MvxAndroidTargetBinding
{
private ICommand _command;
private IDisposable _checkedChangeSubscription;
private IDisposable _canExecuteSubscription;
private readonly EventHandler<EventArgs> _canExecuteEventHandler;
protected CompoundButton View => (CompoundButton)Target;
public MvxCompoundButtonCheckedChangeBinding(CompoundButton view)
: base(view)
{
_canExecuteEventHandler = OnCanExecuteChanged;
_checkedChangeSubscription = view.WeakSubscribe<CompoundButton, CompoundButton.CheckedChangeEventArgs>(nameof(view.CheckedChange), ViewOnCheckedChangeClick);
}
private void ViewOnCheckedChangeClick(object sender, CompoundButton.CheckedChangeEventArgs args)
{
if (_command == null)
return;
if (!_command.CanExecute(null))
return;
_command.Execute(view.Checked);
}
protected override void SetValueImpl(object target, object value)
{
_canExecuteSubscription?.Dispose();
_canExecuteSubscription = null;
_command = value as ICommand;
if (_command != null)
{
_canExecuteSubscription = _command.WeakSubscribe(_canExecuteEventHandler);
}
RefreshEnabledState();
}
private void RefreshEnabledState()
{
var view = View;
if (view == null)
return;
var shouldBeEnabled = false;
if (_command != null)
{
shouldBeEnabled = _command.CanExecute(null);
}
view.Enabled = shouldBeEnabled;
}
private void OnCanExecuteChanged(object sender, EventArgs e)
{
RefreshEnabledState();
}
public override MvxBindingMode DefaultMode => MvxBindingMode.OneWay;
public override Type TargetType => typeof(ICommand);
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
_checkedChangeSubscription?.Dispose();
_checkedChangeSubscription = null;
_canExecuteSubscription?.Dispose();
_canExecuteSubscription = null;
}
base.Dispose(isDisposing);
}
}
然后您需要在 FillTargetFactories
覆盖中的 Setup.cs 中注册它:
registry.RegisterCustomBindingFactory<View>("MyCheckedChange",
view => new MvxCompoundButtonCheckedChangeBinding(view));
然后您可以将 MyCheckedChange 绑定(bind)到您的命令。
关于android - MvxBind CheckedChange SwitchCompat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41259474/
我在将 Android.Support.V7.Widget.SwitchCompat 绑定(bind)到我的 View 模型时遇到了麻烦(Mvvmcross 是我正在使用的框架)我做了与在另一个对象上
我找不到可用的所有类型的 Binder 列表,最近一位同事发现了 local:MvxBind="Visibility Property",这对我们的代码有很大帮助。我相信 MvvMCross 有很多我
我使用 Android 的官方 FloatingActionButton。我的问题是绑定(bind)不起作用。在我的例子中,点击事件 (local:MvxBind="Click GoToSharePa
我正在尝试更改 RecyclerView 的项目颜色。下面的代码仅显示了项目布局的根布局 RelativeLayout。 我有以下代码: (项目)布局: ... View 模型: public
在我的 Android MvvmCross 应用程序中,我的 ToggleButton 绑定(bind)在调试构建中表现出色,但在发布时却失败了。 我的 ToggleButton 和绑定(bind)定
我在 Xamarin 中遇到 Android 应用程序问题。我有 MenuCardView.axml,其中 MvxGridView 和 ItemSource 但我不想在这里使用 ItemClick。我
如何使用 bool 值的组合来设置 MvxBind 按钮上的 enabled 属性? 例如: 使用一个 bool 值,通过以下方式实现绑定(bind): 但是我该如何使用多个 bool 值来实现呢?
我有一个小问题: 在我的 axml 设计器中,我有这样的东西: 这很好用,但我怎么能组合/连接 2 个属性(或更多).. 所以类似于:FirstName + SecondName(一个文本中有 2
嘿,我是 MvvmCross 初学者,我尝试重现 this在我自己的示例应用程序中,但我遇到了一些奇怪的构建错误: 错误 3 属性“MvxBind”已定义 错误 4 属性“MvxLang”已定义 错误
解决方案之前运行良好,直到我将菜单添加到应用程序并构建,它给了我上述错误。我的代码如下: 有什么解决办法吗?我努力了 1) xmlns:local="http://sche
我正在尝试使用提供的代码创建一个简单的服务,但我不明白为什么在绑定(bind)时会出现异常。 10-19 11:42:09.148 I/mono-stdout(1622):MvxBind:Error:
我有一个包含 LocationViewModel 的 ObservableCollection 的 ViewModel。这些在网格中显示为图 block 。每个 LocationViewModel 都
使用 MvxBind 绑定(bind)到 ViewModel 属性的常用 MvvmCross 语法android 布局文件中的属性如下所示: 所以访问ViewModel.ViewModelPrope
我刚刚开始我的第一个 Xamarin 应用程序,并且已经设置了与新解决方案的默认配置非常相似的东西,更改非常少。 应用程序可以正常编译并部署到虚拟设备。 MvxBindingAttributes.xm
我是一名优秀的程序员,十分优秀!