如何将视图模型的caliburn.micro绑定到组合框选择值?

Aar*_*ide 14 c# wpf caliburn.micro

WPF和Caliburn.Micro的曲线相对较低.

我的目标是将组合框选定项目的绑定从后面的ShellView代码移动到视图模型,就像组合框的项目集合一样.

XAML:

<Window x:Class="EomDatabaseUtility.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Eom Tool Database Utility" Height="350" Width="525">
    <Grid>
        <DataGrid AutoGenerateColumns="False" Height="258" HorizontalAlignment="Left" Margin="12,41,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" />
        <Button Content="Execute" Height="23" HorizontalAlignment="Left" Margin="416,12,0,0" VerticalAlignment="Top" Width="75" x:Name="Execute" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top" Width="120" x:Name="CatalogName" SelectedValuePath="{Binding Path=SelectedCatalogName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

Code Behind(如果我理解正确的话,目标是不必添加任何代码):

namespace EomDatabaseUtility.Views
{
    using System.Windows;

    public partial class ShellView : Window
    {
        public ShellView()
        {
            InitializeComponent();
        }

        // --> This should go in the view model, Right?
        private string selectedCatalogName;
        public string SelectedCatalogName
        {
            get { return selectedCatalogName; }
            set { selectedCatalogName = value; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

View Model(当前为组合框提供项目集合以及按钮事件处理程序):

namespace EomDatabaseUtility.ViewModels
{
    using Caliburn.Micro;
    using System.Collections.Generic;

    public class ShellViewModel : PropertyChangedBase
    {
        public List<string> CatalogName
        {
            get
            {
                return new List<string> { "foo", "bar" };
            }
        }

        public void Execute()
        {
            System.Windows.MessageBox.Show("hello");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

dev*_*tal 36

你可以绑定SelectedItemComboBox对您的视图模型的属性:

<ComboBox x:Name="CatalogName" ... SelectedItem="{Binding SelectedCatalog}" />

public class ShellViewModel : PropertyChangedBase
{
    private string selectedCatalog;

    public List<string> CatalogName
    {
        get
        {
            return new List<string> { "foo", "bar" };
        }
    }

    public string SelectedCatalog
    {
       get
       {
          return this.selectedCatalog;
       }

       set
       {
          this.selectedCatalog = value;
          this.NotifyOfPropertyChange(() => this.SelectedCatalog);
       }
    }
Run Code Online (Sandbox Code Playgroud)

事实上,因为你ComboBox拥有的名称CatalogName编,该Caliburn.Micro约定将寻找一个叫做财产SelectedCatalogName(或ActiveCatalogName)并自动绑定ComboBoxSelectedItem到,所以因此你可以使用:

<ComboBox x:Name="CatalogName" ... />

public string SelectedCatalogName
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • 我们打电话给NotifyOfPropertyChange()安装员SelectedCatalog.每当我们从视图模型设置值时,这都会通知UI该值已更改,以便UI得到更新.这种方法是其中的一部分PropertyChangedBase.
  • 您应该在视图模型中使用支持集合更改通知的集合类型,例如ObservableCollectionWPF或Caliburn.Micro BindableCollection(实现Caliburn.Micro IObservableCollection).这允许在从视图模型中添加/删除集合中的对象时通知UI.
  • 您的shell视图模型应该实现一个ScreenConductor类型(而不是PropertyChangedBase),如果它将具有生命周期(激活/停用等),或者将具有可在运行时更改的当前活动项(屏幕).

  • 啊,您可以尝试命名组合框CatalogNames,然后使用CatalogNames属性和SelectedCatalogName.我希望这能奏效. (2认同)
  • 是的,做到了..我喜欢! (2认同)