【问题标题】:How to cast in WPF如何在 WPF 中进行投射
【发布时间】:2015-08-20 18:18:49
【问题描述】:

我碰巧需要将 Grid 的 DataContext 绑定到 listview 的 SelectedItem 属性

我可以毫无问题地这样做......但是,由于 Listview 的 SelectedItem 存储了一个对象,XAML 编辑器不知道它正在使用的类型,这会导致显示以下警告:“不能在“对象”类型的数据上下文中解析属性 X"

有没有办法在其中一个绑定中指定对象的类型(我搜索了 WPF 转换但没有找到相关资源)

这是我的 XAML 的相关摘录:

<ListView x:Name="ListView" ItemsSource="{Binding LoginScreens}" Grid.Column="0" Grid.Row="0" SelectionMode="Single"/>
<Grid Grid.Column="1" Grid.Row="0" DataContext="{Binding SelectedItem, ElementName=ListView}">
    <Grid.RowDefinitions>
       /*rows*/
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      /*Columns*/
    </Grid.ColumnDefinitions>
    <TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource TextBoxStyle}" Text="{Binding Name}"/>
    <TextBox Grid.Row="1" Grid.Column="1" Style="{StaticResource TextBoxStyle}" Text="{Binding NameFr}"/>
    <TextBox Grid.Row="2" Grid.Column="1" Style="{StaticResource TextBoxStyle}" IsEnabled="False" Text="{Binding Filename}"/>
    <TextBox Grid.Row="3" Grid.Column="1" Style="{StaticResource TextBoxStyle}" IsEnabled="False" Text="{Binding SHA1}"/>
</Grid>

我在 TextBox 的绑定中尝试了以下语法,但不起作用:

<TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource TextBoxStyle}" Text="{Binding (manifestEditor:LoginScreen.Filename)}"/>

但它会导致在 ListDictionary 中的键为空时引发错误,所以要么我遗漏了某些东西,要么这不是正确的方法。

编辑:

我希望尽可能只使用 XAML 来处理这个

【问题讨论】:

  • 这是因为它直到运行时才知道对象将是什么(尽管您认为在许多情况下它会)。我倾向于忽略它。
  • 好吧,我只是想知道,如果我能给它一个提示,我知道该项目将是什么样的对象
  • 运行时绑定正确吗?
  • @mariocatch 所有绑定都在运行时工作,我只是想知道是否可以在设计时避免警告
  • @Sidewinder94 可能只是设计时的问题,可能由stackoverflow.com/questions/15231120/…解决

标签: c# wpf xaml


【解决方案1】:

您的代码对我来说很好用。在这里添加一些新的有用的东西是定义与 SelectedItem 的绑定的另一种方法:

    <Grid>
    <StackPanel>
        <ListView x:Name="ListView" ItemsSource="{Binding LoginScreens}" 
                  IsSynchronizedWithCurrentItem="True" 
                  SelectionMode="Single"/>
        <Grid DataContext="{Binding LoginScreens}">
            <StackPanel>
                <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Name}"/>
                <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding NameFr}"/>
                <TextBox Grid.Row="2" Grid.Column="1" IsEnabled="False" Text="{Binding Filename}"/>
                <TextBox Grid.Row="3" Grid.Column="1" IsEnabled="False" Text="{Binding SHA1}"/>
            </StackPanel>
        </Grid>
    </StackPanel>
</Grid>

IsSynchronizedWithCurrentItem 将绑定集合的默认 CollectionView 的 CurrentItem 与控件的 SelectedItem 同步,并通过选择 Grid 的 DataContext 作为 ObservableCollection LoginScreens,您将根据 ListView 选择获得更新。

【讨论】:

    【解决方案2】:

    将 SelectedItem 数据绑定到 ViewModel。将 DataGrid 的 datacontext 数据绑定到相同的 ViewModel。只要 ViewModel 知道它正在使用什么类型,一切都应该运行良好。

    【讨论】:

    • 我试图找到一种方法来避免在此代码上使用 C# 代码并留在 XAML 中:) 将在问题中添加此精度
    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多