C# Windows 10 x:绑定到SelectedItem

C# Windows 10 x:绑定到SelectedItem,c#,binding,windows-10,C#,Binding,Windows 10,我正在尝试将我的Windows RT应用移植/采用到Windows 10,并且正在尝试新的绑定x:Bind 到目前为止,我能够绑定到我的ViewModel属性和其他ViewElement。但现在我正试图将文本框的文本绑定到GridView的SelectedItem 在经典装订中,我就是这样做的 <TextBox x:Name="tb_textgroup" Grid.Row="1"

我正在尝试将我的Windows RT应用移植/采用到Windows 10,并且正在尝试新的绑定x:Bind

到目前为止,我能够绑定到我的ViewModel属性和其他ViewElement。但现在我正试图将文本框的文本绑定到GridView的SelectedItem

在经典装订中,我就是这样做的

<TextBox x:Name="tb_textgroup"
                             Grid.Row="1"
                             PlaceholderText="Change Groupname"
                             Text="{Binding UpdateSourceTrigger=PropertyChanged,
                                    ElementName=gv_textgroup,
                                    Mode=TwoWay,Path=SelectedItem.bezeich}"
                             IsEnabled="{Binding UpdateSourceTrigger=PropertyChanged,
                                       ElementName=gv_textgroup,
                                       Mode=TwoWay,Path=SelectedItem.edit_activated}"
                             Margin="20,10,20,0"
                             />

我试过了

  • Text=“{x:Bind gv_textgroup.SelectedItem.bezeich,Mode=TwoWay}”
  • Text=“{x:Bind textgroup[gv_textgroup.SelectedIndex].bezeich,Mode=TwoWay}”
    • 其中textgroup是包含所有元素的viewmodelclass
但这一切都不起作用。。。有什么想法吗

有人能告诉我怎么处理“依赖财产”吗。我观看了《build 2015》中的viedo,并获得了示例代码。但它对我来说什么都没说。。。我是个新手


非常感谢您的帮助

您不能在GridView的SelectedItem上使用x:Bind。这是因为SelectedItem是一个对象,所以它可以是任何对象。x:Bind需要有实际的类/接口。x:Bind不像Binding那样使用反射来查找属性

您可以通过x:Bind将GridView的SelectedItem绑定到视图模型,然后x:Bind从TextBlock绑定到该视图模型来实现这一点。我不确定这是否真的会像您希望的那样对性能有帮助

public class ViewModel
{
    public MyItem SelectedItem { get; set; } //fire prop changed
}

<GridView SelectedItem="{x:Bind SelectedItem, mode=Twoway}"/>
<TextBlock Text="{x:Bind ViewModel.SelectedItem.bezeich}"
公共类视图模型
{
公共MyItem SelectedItem{get;set;}//fire道具已更改
}

我不知道为什么会这样,但如果您创建一个对象到对象转换器,
x:Bind
可以在任何
SelectedItem
上进行双向转换

public class NoopConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value;
    }
}
您可以这样使用它:

<ListView ItemsSource="{x:Bind ViewModel.Items}"
         SelectedItem="{x:Bind ViewModel.SelectedItem, Mode=TwoWay, Converter={StaticResource NoopConverter}}"
         ...

恐怕你是对的。但我认为这真的是一个微不足道的角色,你不能把它从一个对象投射到你的类中。不管怎样,我希望微软能像他们在构建中提到的那样改进这项技术(我想我在视频中读过/听到过)。感谢您的时间,他们怎么可能知道您想要的对象是什么。x:Bind是一个编译时指令。这意味着它将在编译时创建绑定到对象/属性的代码。您不能期望编译器知道您希望对象的类型为MyObject。可能是这样的:实际上,viewmodel属性可以是普通对象。。。除非你用的是转换器,否则它必须是。DataTemplate的x:DataType表示对象实际应该是什么类型的类。这并没有改变您不能将x:bind绑定到其他xaml元素属性的事实。这是因为当编译器看到绑定有转换器时,它会忽略可能存在类型冲突的事实,并允许代码存在运行时异常的风险。