wpf 如何替换不同组合框的元素?

9o685dep  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(117)

我所要做的就是替换Combobox元素。每个Combobox都绑定在同一个Array上,所以应该不会有问题。**应该有一个按钮,它提供这个“Combobox replace”点击。**这里是Combobox XAML的一个(第二个是非常相似的):

<ComboBox
            x:Name="from"
            Grid.Column="1"
            Grid.ColumnSpan="4"
            Width="340"
            Height="40"
            Margin="18,0,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            DropDownClosed="from_DropDownClosed"
            FontFamily="Montserrat"
            FontSize="20"
            IsSynchronizedWithCurrentItem="False"
            ItemsSource="{Binding Angle}"
            SelectedValue="{Binding Angle[0]}"
            SelectionChanged="from_SelectionChanged" />

第二个Combobox的XAML:

<ComboBox
            x:Name="to"
            Grid.Row="2"
            Grid.Column="1"
            Grid.ColumnSpan="4"
            Width="340"
            Height="40"
            Margin="18,0,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            DropDownClosed="to_DropDownClosed"
            FontFamily="Montserrat"
            FontSize="20"
            IsSynchronizedWithCurrentItem="False"
            ItemsSource="{Binding Angle}"
            SelectedValue="{Binding Angle[1]}"
            SelectionChanged="to_SelectionChanged" />

我的尝试是更改组合框SelectedItem的索引。但它的工作原理很奇怪。这样,第二个组合框的选择就改变了。但另一个没有任何变化。下面是我的代码版本(无法正常工作):

object item1 = from.SelectedItem;
object item2 = to.SelectedItem;

// Replacing them
from.SelectedItem = item2;
to.SelectedItem = item1;

下一页的图片:Page overview

n7taea2i

n7taea2i1#

我认为问题在于SelectedItem值总是看Angle[x]值。
尝试创建两个单独的属性SelectedItem1SelectedItem2,并将每个ComboBoxSelectedItem绑定到相应的属性。
我还建议您使用SelectedItem属性而不是SelectionChanged事件,以保留MVVM原则(如果您的事件代码需要访问ViewModel数据)。
此外,您可以使用ObservableCollection<MyClassOrType>而不是数组来简化操作。
就像这样:

private ObservableCollection<MyClassOrType> angle = new ObservableCollection<MyClassOrType>();
public ObservableCollection<MyClassOrType> Angle
{
    get => angle;
    private set => angle = value;
}

private MyClassOrType selected_item_1;
public MyClassOrType SelectedItem1
{
    get => selected_item_1;
    set
    {
        selected_item_1 = value;
        OnPropertyChanged(nameof(SelectedItem1)); // Notify view of the change
        // Do your from_SelectionChanged code here
    }
}

private MyClassOrType selected_item_2;
public MyClassOrType SelectedItem2
{
    get => selected_item_2;
    set
    {
        selected_item_2 = value;
        OnPropertyChanged(nameof(SelectedItem2)); // Notify view of the change
        // Do your to_SelectionChanged code here
    }
}

MyClassOrType是存储在集合中的任何对象类型(int、float、类等)。
然后你可以像这样绑定你的ComboBox

<ComboBox
  x:Name="from"
  Grid.Column="1"
  Grid.ColumnSpan="4"
  Width="340"
  Height="40"
  Margin="18,0,0,0"
  HorizontalAlignment="Left"
  VerticalAlignment="Center"
  VerticalContentAlignment="Center"
  DropDownClosed="from_DropDownClosed"
  FontFamily="Montserrat"
  FontSize="20"
  IsSynchronizedWithCurrentItem="False"
  ItemsSource="{Binding Angle}"
  SelectedValue="{Binding SelectedItem1}" />

<ComboBox
  x:Name="to"
  Grid.Row="2"
  Grid.Column="1"
  Grid.ColumnSpan="4"
  Width="340"
  Height="40"
  Margin="18,0,0,0"
  HorizontalAlignment="Left"
  VerticalAlignment="Center"
  VerticalContentAlignment="Center"
  DropDownClosed="to_DropDownClosed"
  FontFamily="Montserrat"
  FontSize="20"
  IsSynchronizedWithCurrentItem="False"
  ItemsSource="{Binding Angle}"
  SelectedValue="{Binding SelectedItem2}" />

下一篇:Button为了保留MVVM原则,你应该绑定到ICommand实现,以便在ViewModel中执行代码,而不是视图本身,因为你是在操纵数据,而不仅仅是视图属性。
在按钮命令绑定中,您可以执行以下操作:

<Button Name="MyButton" Command="{Binding MyCommand}"/>

后面的代码:

MyCommand()
{
   int sel_item_1 = Angle[Angle.IndexOf(SelectedItem1)];
   SelectedItem1 = Angle[Angle.IndexOf(SelectedItem2)];
   SelectedItem2 = Angle[sel_item_1];
}

相关问题