【问题标题】:Windows 10 x:Bind to SelectedItemWindows 10 x:绑定到 SelectedItem
【发布时间】:2016-01-27 15:16:09
【问题描述】:

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

到目前为止,我能够绑定到我的 ViewModel 属性和其他 Viewelements。但现在我正在尝试将 TextBox 的文本绑定到 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:绑定文本组[gv_textgroup.SelectedIndex].bezeich, Mode=TwoWay}"
    • 其中 textgroup 是包含所有元素的视图模型类

但没有一个奏效......有什么想法吗?

谁能解释我如何处理“DependencyProperty”。我从“build 2015”观看了视频并获得了示例代码。但这对我没有任何意义...我是个新手...

非常感谢您的帮助

【问题讨论】:

    标签: c# binding windows-10


    【解决方案1】:

    我不确定为什么会这样,但是如果您创建一个对象到对象的转换器,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}}"
             ...
    

    特别感谢 runceel 提供的公开样本。

    他用日语解释here

    【讨论】:

    • 之所以有效,是因为当编译器看到有一个用于绑定的转换器时,它会忽略可能存在类型冲突的事实,并允许代码存在运行时异常的风险。
    【解决方案2】:

    您不能在 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}"
    

    【讨论】:

    • 恐怕你是对的。但我认为这真的是一个遗憾,你不能从对象投射到你的班级。无论如何,我希望微软能像他们在构建中提到的那样改进该技术(我认为我已经在视频中阅读/听到了它)。感谢您的宝贵时间
    • 他们怎么可能知道你想要的对象是什么。 x:Bind 是一个编译时指令。这意味着它将在编译时创建绑定到您的对象/属性的代码。你不能指望编译器知道你想要一个对象是 MyObject 类型。
    • 可能是这样的:
      实际上,viewmodel 属性可以是一个普通对象……除非您使用的是转换器,否则它必须是。 DataTemplate 的 x:DataType 表示对象真正应该是什么类型的类。这不会改变您不能 x:bind 到其他 xaml 元素属性的事实。
    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2010-12-26
    • 2011-01-02
    • 1970-01-01
    • 2014-10-10
    • 2019-12-05
    相关资源
    最近更新 更多