从ListBox设置选定项的XAML ComboBox无法正常工作

时间:2015-05-30 14:31:07

标签: c# xaml combobox listbox

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

部分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始终有效,但绑定Obj.Typnamn在从UI中选择组合框项时停止工作。
在调试应用程序并在列表框中选择一个对象时,我发现在调用Obj中的PropertyChanged方法后,立即窗口会显示以下消息四次。在没有调试的情况下运行时不会出现错误。

  

类型&#39; System.Runtime.InteropServices.COMException&#39;的第一次偶然异常。发生在mscorlib.dll


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

1 个答案:

答案 0 :(得分:0)

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

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

SelectedValue =&#34; {Binding Obj.Typnamn,Mode = OneWay}&#34;

  

SelectedValue =&#34; {Binding Obj.Typnamn,Mode = TwoWay}&#34;

与我在问题中所说的相反。我为这个不必要的问题道歉。