【问题标题】:DependencyProperty Binding Does Not Update To Collection CurrentItemDependencyProperty 绑定不会更新到集合 CurrentItem
【发布时间】:2012-08-08 02:21:33
【问题描述】:

我正在尝试将依赖属性绑定到集合的当前选择,但由于我似乎无法理解的原因,当集合更改时绑定不会更新。

在下面的例子中,我展示了两个例子。一个是正​​确更新(在 textblock/run 上),另一个只显示初始元素并且在数据网格选择更改时不会更改。

<Grid>
    <Grid.Resources>
        <CollectionViewSource Source="{Binding Path=List}" x:Key="myViewModel"/>
        <my:UpdateNotWorking MyObjModel="{Binding Source={StaticResource myViewModel}, Path=CurrentItem}" x:Key="updateNotWorking" />
    </Grid.Resources>

    <DataGrid ItemsSource="{Binding Source={StaticResource myViewModel}}" Name="mylistbox"/>
    <TextBlock TextWrapping="Wrap" FontWeight="Bold" Foreground="#FF50CEFF" FontSize="24" TextAlignment="Center" Height="75">
            <Run Text="{Binding Source={StaticResource myViewModel}, Path=text}" Foreground="#FF00E200" />
    </TextBlock>
    <TextBox Text="{Binding Source={StaticResource updateNotWorking}, Path=MyObjModel.text}" Height="22"/>

</Grid>

在此示例中,我的依赖属性是“UpdateNotWorking”依赖对象上的“MyObjModel”,它是从 xaml 代码实例化的。

如果我能提供任何有关我的资源未正确更新的原因的信息,我将不胜感激。

Example Project

【问题讨论】:

    标签: c# .net wpf xaml binding


    【解决方案1】:

    将此 XAML 粘贴到您的 MainWindow 中。

      <Grid>
        <Grid.Resources>
          <CollectionViewSource Source="{Binding Path=List}" x:Key="myViewModel" />
          <my:UpdateNotWorking x:Key="updateNotWorking" />
        </Grid.Resources>
    
        <DataGrid ItemsSource="{Binding Source={StaticResource myViewModel}}" Name="mylistbox"
                  SelectedItem="{Binding Source={StaticResource updateNotWorking}, Path=MyObjModel, UpdateSourceTrigger=PropertyChanged}" />
        <TextBlock TextWrapping="Wrap" FontWeight="Bold" Foreground="#FF50CEFF" FontSize="24" TextAlignment="Center"
                   Height="75">
          <Run Text="{Binding Source={StaticResource myViewModel}, Path=text}" Foreground="#FF00E200" />
        </TextBlock>
        <TextBox Text="{Binding Source={StaticResource updateNotWorking}, Path=MyObjModel.text, UpdateSourceTrigger=PropertyChanged}"
                 Height="22" />
    
      </Grid>
    

    它现在所做的是根据 DataGrid 的 SelectedValue 设置 updateNotWorkingMyObjModel 属性,并将 UpdatePropertyTrigger 设置为 PropertyChanged 以立即查看更改。我们不再需要通过 List 的 CurrentItem 定义 updateNotWorking 的属性,因为它不会仅通过使用 DataGrid 选择它来改变。您可以保持设置,但这不是必需的,因为我们正在使用DataGrid SelectedValue 完成所有体力劳动。

    【讨论】:

    • 这行得通,但我仍然不明白为什么前面的代码不起作用。我没有绑定到集合视图的当前项目吗?为什么不改变?
    • 因为 CurrentItem 是只读的,而且它不是依赖属性(所以它不能绑定到),最后它没有实现 INotifyPropertyChanged 所以它对任何类型的 UI 绑定都没有用.另一方面,DataGrid 的 SelectedValue 是一个依赖属性,它满足使 UI 绑定正常工作的所有要求。所以我们基本上只是“逆转”了你正在做的事情,你的路线被动地等待价值改变[无济于事],而这正在积极改变价值。
    • 这样就更清楚了。非常感谢您的解释!
    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 2017-06-13
    • 2013-02-21
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多