ReactiveUI - 我应该使用{Binding}还是this.Bind(...)?

时间:2016-04-12 11:05:03

标签: c# wpf xaml system.reactive reactiveui

使用ReactiveUI时,可以在xaml ...

中设置绑定
.xaml

或在

背后的代码中
<ListView>
    <ListView.ItemTemplate>
        <DataTemplate DataType="ListViewItem">
            <TextBox Text="{Binding ChildViewModelProperty}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

似乎某些情况(例如绑定到ListBox中的子对象)使用{Binding }选项似乎是唯一的方法

例如

.xaml

我错误地使用code behind或者我可以根据需要混合搭配getStringExtra(); String name = data.getStringExtra("Medicine"); 吗?

2 个答案:

答案 0 :(得分:3)

我认为你可能会在不使用XAML绑定的情况下(几乎)离开,但需要额外付出代价。我将以保罗贝茨的XamarinEvolve2014 demo为例。

首先,您需要为列表中的项目定义ViewModel(类似于LoginTeamTileViewModel):

public class TileViewModel : ReactiveObject
{
    string name;
    public string Name {
        get { return name; }
        set { this.RaiseAndSetIfChanged(ref name, value); }
    }
}

然后,您需要在ViewModel中公开这些类的集合 - for example as a ReactiveList

public class ViewModel : ReactiveObject
{
    public ReactiveList<TileViewModel> Tiles { get; private set; }
}

您可以使用ReactiveDerivedCollection从模型中创建这些ViewModel。

接下来,为TileViewModelsimilar to this one from Evolve example创建一个简单的视图。

最后,您应该在列表视图中使用创建的视图作为数据模板like in the example。请注意,它仍然使用{Binding},但仅适用于ViewModel属性,而不适用于单独的字段,这似乎更清晰。 (可悲的是,我有一段时间没有写过任何WPF,所以我不能在这里快速写任何例子 - 欢迎编辑!)。

在你的代码中,你应该将你的集合绑定到ListView的ItemsSourcelike here

this.OneWayBind(ViewModel, vm => vm.Tiles, v => v.ListView.ItemsSource);

希望这有帮助!

答案 1 :(得分:-5)

不,你没有错误使用Binding ....如果你想'掌握'WPF \ XAML然后坚持MVVM模式(绑定),我的意思是坚持它....如果你'混合和匹配.xaml和代码背后的'你将最终得到无法维护,无法管理的意大利面条代码......

听起来你已经掌握了'绑定',你的挑战应该是编写一个WPF应用程序,除了Visual Studio创建的内容之外绝对没有代码隐藏......

就个人而言,我拒绝处理不遵循MVVM模式的WPF应用程序,它告诉我原始开发人员并不打算编写另一个开发人员(甚至他们自己)可以工作的代码......

您可能会发现这个链接很有用......

https://rachel53461.wordpress.com/category/mvvm/

ionoy

放置在Window \ UserControl * .cs文件中的任何代码都会破坏MVVM模式,可能除了自定义控件之外,您可以使用Dependencyproperties在属性编辑器中公开属性(在设计时)...

例如,您应该使用实现ICommand而不是事件处理程序的RelayCommand(或DelegateCommand)。也就是说,永远不要简单地双击按钮在Window的* .cs文件中创建事件存根(不是MVVM),在ViewModel中创建一个Command,它应该是一个单独的文件(不是Window) .cs文件coz继承自Window,这是一个继承UserControl的UserControl)。你的ViewModel需要实现InotifyPropertyChanged或继承一个实现InotifyPropertyChanged的ViewModelBase,然后你应该使用按钮的Command和CommandParame来绑定并调用\ pass对象回到ViewModel,即MVVM

你可能会觉得这很有用......

http://www.c-sharpcorner.com/UploadFile/raj1979/simple-mvvm-pattern-in-wpf/

相关问题