问题描述
简而言之,我已经设法使用行为和命令在我的视图中的控件发生事件后,在我的 viewmodel 中连接了一个要触发的操作,但这最终需要解决框架中的错误,该错误使我怀疑这是否是解决此类问题的正确方法。
具体来说,我在我的 viewmodel 中执行了一些计算,我想在用户完成更新我的视图中的 Entry 控件后执行这些计算。我决定这应该挂起 Completed 事件。为了做到这一点,我像这样设置了我的代码;
EntryCommand.cs
namespace SocialStocksCross.Command
{
public class EntryCommand : ICommand
{
public Action _callback;
public EntryCommand()
{
}
public bool CanExecute(object test)
{
return true;
}
public void Execute(object test)
{
_callback();
}
public event EventHandler CanExecuteChanged;
}
}
MainPageviewmodel.cs
public class MainPageviewmodel : INotifyPropertyChanged
{
public MainPageviewmodel()
{
CommandVM = new EntryCommand();
CommandVM._callback = CalculateStuff;
UpdateLabel();
}
private EntryCommand _command;
public EntryCommand CommandVM
{
get
{
return _command;
}
set
{
_command = value;
}
}
public void CalculateStuff()
{
// does stuff
}
}
我的行为类是这样定义的;
namespace SocialStocksCross.Behaviors
{
class EntryBehavior : Behavior<Entry>
{
public static readonly BindableProperty CommandProperty =
BindableProperty.Create("Command",typeof(ICommand),typeof(EntryBehavior),null);
public ICommand Command
{
get
{
return (ICommand)GetValue(CommandProperty);
}
set
{
SetValue(CommandProperty,value);
}
}
protected override void OnAttachedTo(Entry bindable)
{
base.OnAttachedTo(bindable);
bindable.Completed += OnEntryCompleted;
// Perform setup
}
protected override void OnDetachingFrom(Entry bindable)
{
base.OnDetachingFrom(bindable);
// Perform clean up
}
void OnEntryTextChanged(object sender,TextChangedEventArgs e)
{
string oldText = e.OldTextValue;
string newText = e.NewTextValue;
}
void OnEntryCompleted(object sender,EventArgs args)
{
if (BindingContext == null)
{
return;
}
// do something
if (Command == null)
{
return;
}
Command.Execute(args);
}
}
}
我的观点的相关部分是这样的;
<Entry Grid.Column="1" Grid.Row="0" x:Name="companySymbol" Text="{Binding CompanySymbol}">
<Entry.Behaviors>
<localbehaviors:EntryBehavior Command="{Binding CommandVM,Mode=OneWayToSource}"></localbehaviors:EntryBehavior>
</Entry.Behaviors>
</Entry>
据我从网上阅读的内容来看,这似乎应该可行,但行为上的命令从未绑定到 viewmodel 上的命令。经过一番挖掘,结果命令的 BindingContext 始终为空,可能是由于这个错误,尽管因为它被标记为关闭,我本以为它会被修复...... https://github.com/xamarin/Xamarin.Forms/issues/2581
我最终要做的是在 .cs 中手动设置 Behavior 的 BindingContext 以从 View 自己的 BindingContext 继承并以这种方式设置我的绑定。虽然我的代码现在工作,但如果这在框架中没有得到修复,我不得不怀疑是否有其他方式应该处理这种事情以及整个行为绑定只是真的不推荐?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)