【问题标题】:XAML ComboBox set selected item from ListBox does not work properlyXAML ComboBox 从 ListBox 中设置选定项无法正常工作
【发布时间】:2015-05-30 14:31:06
【问题描述】:

我有一个对象列表。我想用一个文本框和一个组合框来维护它们的属性。对象列表显示在列表框中。选择对象时,其属性显示在文本框和组合框中。问题是,如果我在组合框中选择一个项目,它会显示,但在从列表框中选择一个对象时它不再改变。

部分 MainPage.xaml

  <ComboBox x:Name="ComboBox1" Grid.Row="1" Grid.Column="1" Margin="20,20,0,0"
                  ItemsSource="{Binding TypNamnLista}"
                  SelectedValue="{Binding Obj.Typnamn, Mode=OneWay}}"
                  />             <!--Same behavior for Mode=TwoWay-->
<ListBox x:Name="ListBox1" Grid.Row="2" Grid.Column="1" Margin="20,20,0,0" Background="{ThemeResource ListBoxBackgroundThemeBrush}" Foreground="Black" BorderBrush="{ThemeResource ListBoxBorderThemeBrush}"
                 ItemsSource="{Binding ObjList}"
                 SelectionMode="Multiple"
                 SelectionChanged="ListBox1_SelectionChanged">
        <ListBox.ItemTemplate>
             <DataTemplate>
                  <StackPanel HorizontalAlignment="Left">
                      <TextBlock Text="{Binding Path=Namn}"/>
                  </StackPanel>
             </DataTemplate>
        </ListBox.ItemTemplate>

部分 MainPage.cs

    public sealed partial class MainPage : Page
    {
        private ObservableDictionary defaultViewModel = new ObservableDictionary();

        public Obj obj { get; set; }
        public ObservableCollection<Obj> ObjList { get; set; }
        public List<string> TypNamnLista { get; set; }

        public ObservableDictionary DefaultViewModel
        {
            get { return this.defaultViewModel; }
        }

        public MainPage()
        {
            this.InitializeComponent();
            this.ObjList = new ObservableCollection<Obj>();
            for (int i = 1; i < 4; i++)
            {
                Obj o = new Obj(); o.Namn = "Obj" + i; o.Typnamn = "Typ" + i;
                ObjList.Add(o);
            }
            obj = new Obj();
            this.DefaultViewModel["Obj"] = obj;
            this.DefaultViewModel["ObjList"] = ObjList;
            this.TypNamnLista = new List<string> { "Typ1", "Typ2", "Typ3" };
            this.DefaultViewModel["TypNamnLista"] = TypNamnLista;
            //DataContext = this; (set in XAML)
        }

        private void ListBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Obj v = (Obj)e.AddedItems[0];
            Debug.WriteLine("ListBox1_SelectionChanged: Namn=" + v.Namn + ", Typnamn=" + v.Typnamn);
            obj.Namn = v.Namn;
            obj.Typnamn = v.Typnamn;

            ((ListBox)sender).SelectedItems.RemoveAt(0); // Requires <ListView SelectionMode="Multiple"
        }

    }
}

类 Obj 具有接口 INotifyPropertyChanged 和代码来触发 XAML 中的绑定 Obj.Namn 和 Obj.Typnamn。绑定 Obj.Namn 一直有效,但是当从 UI 中选择组合框项目时,绑定 Obj.Typnamn 停止工作。
在调试应用程序并在列表框中选择一个对象时,我观察到在 Obj 中的 PropertyChanged 方法被调用后,立即窗口显示以下消息四次。在没有调试的情况下运行时不会出现错误。

在 mscorlib.dll 中发生了“System.Runtime.InteropServices.COMException”类型的第一次机会异常


我将不胜感激帮助找出我的代码中的错误或另一种方法来维护一个对象列表,其中一个属性绑定到数量非常有限的字符串之一。

【问题讨论】:

  • 你能附上一个示例项目吗?

标签: c# xaml combobox listbox


【解决方案1】:

我再次对此进行了测试,发现从

更改组合框的 XAML 时它可以工作

SelectedValue="{Binding Obj.Typnamn, Mode=OneWay}"

SelectedValue="{Binding Obj.Typnamn, Mode=TwoWay}"

与我在问题中所说的相反。对于不必要的问题,我深表歉意。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多