【问题标题】:ComboBox Binding with two different properties from two different classes in MVVM C#ComboBox 绑定来自 MVVM C#​​ 中两个不同类的两个不同属性
【发布时间】:2019-04-30 09:54:25
【问题描述】:

我不得不重写我的问题。下面的黑引号部分是编辑前的这篇文章。

我有两个属性:capacitiveCurrentShowProductSum。 在对我的 MVVM 应用程序进行任何更改之前,我曾经将 capacitiveCurrent 与在构造函数中设置的值绑定 - 它始终为 15。

capacitiveCurrent被放在不同的类LineOut,代码:

capacitiveCurrent 属性

    private double _capacitiveCurrent;
    public double CapacitiveCurrent
    {
        get { return _capacitiveCurrent; }
        set
        {
            if (_capacitiveCurrent != value)
            {
                _capacitiveCurrent = value;
                OnPropertyChanged("_capacitiveCurrent");
            }
        }
    }

第二个属性放在MainWindow.xaml.cs代码中:

ShowProductSum

        public double _showProductSum;
    public double ShowProductSum
    {
        get { return _showProductSum; }
        set
        {
            if (_showProductSum != value)
            {
                _showProductSum = value;
                OnPropertyChanged("ProductSum");
            }
        }
    }

设置和获取ShowProductSum 的逻辑已经完成.. 差不多了。但是我对这两个属性的期望是我希望它们出现在 ComboBox 中。这就是我所拥有的:

    private ObservableCollection<double> _comboBoxCapacitiveCurrent = new ObservableCollection<double>();
    public ObservableCollection<double> ComboBoxCapacitiveCurrent
    {
        get
        {
            _comboBoxCapacitiveCurrent.Clear();
            _comboBoxCapacitiveCurrent.Add(lineWy.capacitiveCurrent);
            _comboBoxCapacitiveCurrent.Add(ShowProductSum);
            return _comboBoxCapacitiveCurrent;
        }
        set
        {
            if (_comboBoxCapacitiveCurrent != value)
            {
                _comboBoxPradPojemnosciowy = value;
                OnPropertyChanged("ComboBoxCapacitiveCurrent");
            }
        }
    }
    public double SelectedItem { get; set; }

组合框

      <DataGridTemplateColumn Header="Capacitive Current " HeaderStyle="{StaticResource ZwarcioweHeaderStyle}">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
         <ComboBox 
                  ItemsSource="{Binding Path=ComboBoxCapacitiveCurrent}"
                  SelectedValue="{Binding Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          >
                  </ComboBox>
         </DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn>

存在组合框,但组合框的下拉列表中没有任何内容。此组合框下方有一些空白区域。 一切都实现了 INotifyPropertyChanged 接口。

提前致谢。

我是 MVVM C#​​ 的绝对初学者。我正在尝试绑定两个属性 它们位于两个不同的类中。

第一个属性是 public double capacitiveCurrent { get; set; } 来自 一个类,直到那时我使用此属性以正常方式查看它 绑定 - 显示初始化值。

 public double productLengthShortCircuitCurrent
    {
    get { return length* capacitiveShortCircuitCurrentwithGround; }
    set { }
    } is a combination of the two `length` and `capacitiveShortCircuitCurrentwithGround` both with getters and

二传手。

ComboBox 放在里面

`<DataGridTemplateColumn Header"ABC">
  <DataGridTemplateColumn.CellTemplate
   <DataTemplate>
    <ComboBox .../>`

我想要做的是将这两个属性列在 组合框和:

  1. 我需要 capacitiveCurrent 可以从视图中编辑,
  1. productLengthShortCircuitCurrent 应该是所有设定值的总和(因此是总和积).. 我应该调用一个函数来执行此操作吗 然后将其绑定到 ComboBox?

**我已经设法设置和获取此属性并实现了获取下面的ProductSum 属性.. 就是显示这两个 组合框中的属性。

我真的很困惑。找了两天的答案,没来 有了一个想法。也许我的知识很浅,但是...试图绑定 这两个属性与public IConnectedProperties Categories 之类的接口和私有_category 列表 getter 和 setter。

【问题讨论】:

  • SO 是一个英文网站。您有没有机会简单地使用您的属性名称?
  • 真的很抱歉,已编辑:)

标签: c# wpf mvvm combobox properties


【解决方案1】:

将您的两个类实例放在一个视图模型类中,并将其绑定到适当的值。 “ViewModels”用于在视图和模型之间进行通信。因此,将所有与视图交互的逻辑都放在视图模型中。然后您必须将您的视图模型绑定到视图,并且您的数据上下文设置在对象上。如果你想在实例中绑定你的属性,你可以使用 Instance.Property 进行绑定

也许these 会帮助你。 对于基本的explanation

【讨论】:

  • 因为我有 Cable.cs (Model) 和 LineOut(Model) 这个 ViewModel 可以在 MainWindows.xaml.cs 文件中吗?也许您可以向我提供有关此主题的更多信息,因为无论我在哪里寻找答案或有关人们倾向于使用的 MVVM 的一些提示,例如:“MyAppViewModel.cs”文件。使用 MainWindow.xaml.cs 文件是一件坏事吗?
  • 是的。我强烈建议使用并拥有文件。 mvvm 的主要目的是分离 ui-logic 和其他层。如果您进行一些单元测试或想要添加具有相同元素的类似视图,您将看到 mvvm 的好处。也许在 GitHub 上查找一些 mvvm 代码以获取更多信息。mvvmexample
【解决方案2】:

在你的设置器中解决这个问题:

_comboBoxPradPojemnosciowy = value; // binding will loose the instance

使用“Clear()”和“Add()”。当您更改实例时 - 绑定仍在旧实例中查找。

_comboBoxPradPojemnosciowy.Clear();
foreach (var item in value)
{
    _comboBoxPradPojemnosciowy.Add(item);
}

OnPropertyChanged("ComboBoxCapacitiveCurrent");

如果 ShowProductSum 部分正常工作,也许这是您唯一需要修复的问题。

组合框绑定:

ItemsSource="{Binding Path=ComboItems}"   
SelectedItem="{Binding Path=SelectedItem}"

Carete 属性和字段:

private ObservableCollection<double> comboItems = new ObservableCollection<double>();
public ObservableCollection<double> ComboItems{
    get
    {
        this.comboItems.Clear();
        this.comboItems.Add(prad_pojemnosciowy);
        this.comboItems.Add(iloczyn_dlugosc_pojemnościowy_prąd_zwarcia_z_ziemią);
        return this.comboItems;
    } 
    set;
}
public double SelectedItem{get;set}

请记住在 setter 中通知“ComboItems”的属性已更改 这两个属性。

【讨论】:

  • 对于我来说很清楚的 ComboBox 绑定。但我提到有两个不同的类,我想将每个类中的一个组合到 ComboBox 中。我应该在哪里创建这些字段和属性?
  • 字段和属性在模型中创建(您在其中实现 INotifyPropertyChanged 接口)。
  • 只是要清楚 - 两个类(实例?)是如何相关的?它们在同一个视图模型中吗?
  • 重写了这篇文章。也许这应该会更好
  • 我设法解决了这个问题。我发现需要 RelativeSource。这是我得到这个 stackoverflow.com/questions/41530138/…> 的帖子。由于我使用了您的代码,因此我将其标记为已回答,非常感谢:)
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2012-11-11
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2018-08-08
相关资源
最近更新 更多