繁体   English   中英

如何使用代码隐藏将ReactiveList绑定到WPF ListBox或ListView?

[英]How to bind ReactiveList to WPF ListBox or ListView using code-behind?

我有一个问题是在我的视图中显示ListBox控件中的ReactiveList的内容。 当我尝试通过代码隐藏绑定绑定它(使用this.OneWayBind(...) )时,列表保持为空。 我使用的是最新的ReactiveUI版本( 6.1.0 )。 如果我将绑定更改为XAML-Binding并删除对OneWayBind(...)的调用,则列表将显示五个String元素。

我不知道为什么这不起作用,一个简单的TextBlock.Text -Binding按预期工作(参见代码)。


MainWindow.xaml

<Window x:Class="View_Location_Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="clr-namespace:View_Location_Test"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <ListBox x:Name="ToasterList">
    <!-- This is working if you uncomment the above line and remove the OneWayBind call in the view-code: -->
    <!--<ListBox x:Name="ToasterList" ItemsSource="{Binding ToasterList}">-->
        <ListBox.Resources>
            <DataTemplate DataType="{x:Type System:String}">
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </ListBox.Resources>
    </ListBox>
    <TextBlock x:Name="ToasterName" />
</StackPanel>

MainWindow.xaml.cs

public partial class MainWindow : Window, IViewFor<ViewModel>
{
    public MainWindow()
    {
        ViewModel = new ViewModel();
        DataContext = ViewModel;

        InitializeComponent();

        // bind
        this.OneWayBind(ViewModel, vm => vm.ToasterList, v => v.ToasterList.ItemsSource);
        this.Bind(ViewModel, vm => vm.Name, v => v.ToasterName.Text);
    }

    public ViewModel ViewModel
    {
        get { return (ViewModel)GetValue(ViewModelProperty); }
        set { SetValue(ViewModelProperty, value); }
    }

    public static readonly DependencyProperty ViewModelProperty =
        DependencyProperty.Register("ViewModel", typeof(ViewModel), typeof(MainWindow), new PropertyMetadata(null));

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = (ViewModel)value; }
    }
}

ViewModel.cs

public class ViewModel : ReactiveObject
{
    public ViewModel()
    {
        ToasterList.Add("Toaster 1");
        ToasterList.Add("Toaster 2");
        ToasterList.Add("Toaster 3");
        ToasterList.Add("Toaster 4");
        ToasterList.Add("Toaster 5");
    }

    private String name = "My name";
    public String Name
    {
        get { return name; }
        set { this.RaiseAndSetIfChanged(ref name, value); }
    }

    private ReactiveList<String> toasterList = new ReactiveList<string>();
    public ReactiveList<String> ToasterList
    {
        get { return toasterList; }
        set { this.RaiseAndSetIfChanged(ref toasterList, value); }
    }
}

这是因为你已经以一种奇怪的方式设置了ItemsTemplate,所以ReactiveUI认为你没有ItemsTemplate并且正在设置基于约定的那个(这对于一个字符串来说是过度杀伤)。

相反,设置如下:

<ListBox x:Name="ToasterList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM