UWP Combobox SelectedItem忽略其绑定值

时间:2016-07-15 10:40:10

标签: c# combobox uwp

为了说明成功和失败,我将使用以下后端。在每种情况下,我都有一系列的东西,以及一个设置为array.First()的属性。

public class MainPage
{
    public MainPage()
    {
        this.InitializeComponent();

        FirstString = Strings.First();
        FirstItem = Items.First();
    }

    public string FirstString { get; set; }
    public Item FirstItem { get; set; }

    public string[] Strings => new[] {"1", "2", "3", "4"};
    public Item[] Items => new[]
    {
        new Item {Index = 1},
        new Item {Index = 2},
        new Item {Index = 3},
        new Item {Index = 4}
    };
}

public class Item
{
    public int Index { get; set; }
}

所以这里是SelectedItem被选中项目中的绑定结果

    <ComboBox ItemsSource="{x:Bind Strings}" 
          SelectedItem="{x:Bind FirstString}">
        <ComboBox.ItemTemplate>
            <DataTemplate x:DataType="system:String">
                <TextBlock Text="{x:Bind}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

以下是无法选择的备用项目的相同代码

    <ComboBox ItemsSource="{x:Bind Items}" 
          SelectedItem="{x:Bind FirstItem}">
        <ComboBox.ItemTemplate>
            <DataTemplate x:DataType="local:Item">
                <TextBlock Text="{x:Bind Index}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

此外,只要我打开Mode=TwoWay,就会在初始绑定期间清除VM中的值。

所以我的问题是,为什么?造成这种情况有什么不同?

1 个答案:

答案 0 :(得分:1)

非常有趣的问题。这是正在发生的事情。

基本上你正在做的是每次都返回一个新的Items集合而不是缓存它。由于您的Items getter被调用两次,一次来自ItemsSource Binding,一次来自FirstItem绑定,该集合被实例化两次。

因为Item是引用类型,所以Item {Index = 1}的两个实例不相等,因此它们不匹配,并且Selected Item绑定不起作用。它适用于字符串,因为它们是值类型,“1”仍然等于“1”,即使它们是不同的实例。

要解决此问题,您需要在每次调用其getter时缓存返回相同的Items实例:

<Button.Style>
         <Style TargetType="Button">
               <Style.Triggers>
                      <DataTrigger Binding="{Binding PermissionsFlag}" Value="False">
                            <Setter Property="Visibility" Value="Hidden"/>
                      </DataTrigger>
               </Style.Triggers>
         </Style>
 </Button.Style>