【问题标题】:How to do caliburn.micro binding of view model to combobox selected value?如何将视图模型的 caliburn.micro 绑定到组合框选定值?
【发布时间】:2012-03-07 20:06:15
【问题描述】:

我在 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>

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

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; }
        }
    }
}

视图模型(当前为组合框和按钮事件处理程序提供项目集合):

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");
        }
    }
}

【问题讨论】:

    标签: c# wpf caliburn.micro


    【解决方案1】:

    您可以将ComboBoxSelectedItem 绑定到视图模型上的属性:

    <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);
           }
        }
    

    事实上,因为您的ComboBox 的名称为CatalogName,Caliburn.Micro 约定将查找名为SelectedCatalogName(或ActiveCatalogName)的属性并自动绑定@987654327 @'s SelectedItem 到那个,所以你可以使用:

    <ComboBox x:Name="CatalogName" ... />
    
    public string SelectedCatalogName
    {
      ...
    }
    

    需要注意的几点:

    • 我们在SelectedCatalog 的setter 中调用NotifyOfPropertyChange()。每当我们从视图模型中设置它时,这都会通知 UI 该值已更改,以便 UI 得到更新。此方法是PropertyChangedBase 的一部分。
    • 您确实应该在视图模型中使用支持集合更改通知的集合类型,例如 WPF 附带的ObservableCollection,或 Caliburn.Micro 的 BindableCollection(它实现了 Caliburn.Micro 的 IObservableCollection)。这允许在从视图模型的集合中添加/删除对象时通知 UI。
    • 如果它有一个生命周期(激活/停用等),或者有一个当前活动的项目(屏幕),可以在运行时更改。

    【讨论】:

    • 谢谢!我让它与 SelectedItem 属性一起工作,但不是 SelectedCatalogName - 然而,这只是一个奖励......
    • 啊,您可以尝试命名组合框 CatalogNames,然后拥有 CatalogNames 属性和 SelectedCatalogName。我希望这能奏效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多