zoukankan      html  css  js  c++  java
  • RelativeSource实例

    Binding中使用RelativeSource

    问题:当前View有一个DataGrid,其DataGridTemplateColum设置了一个ComboBox。

    其对应的VM是local:ViewMode,含有ModelValuemyLIst属性分别用来做DataGrid的ItemSource,和ComboBox的ItemSource外层内层看起来链接的VM层不同的property。

    初始代码如下:

    <DataGrid ItemsSource="{Binding ModelValues, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
           <DataGridTemplateColumn Header="myHeader" Width="200">
                <DataGridTemplateColumn.CellTemplate>
                     <DataTemplate>
                          <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"
                               SelectedValue="{Binding myID, Mode=TwoWay}"
                               ItemsSource="{Binding Path=myList, 
                               RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ViewModel}}}" />
                     </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                     <DataTemplate>
                          <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"
                               SelectedValue="{Binding myID, Mode=TwoWay}"
                               ItemsSource="{Binding Path=myList, 
                               RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ViewModel}}}" />
                     </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
           </DataGridTemplateColumn>
      </DataGrid>
    
    View Code
    View Code

    错误在于RelativeSource沿着Visual Tree找不到一个叫local:ViewModel的图形对象

    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ViewModel}}

    解决代码:The Relativesource is for the Visual Tree, not the DataContext

    <DataGrid ItemsSource="{Binding ModelValues, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
      <DataGridTemplateColumn Header="myHeader" Width="200">
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"
                          SelectedValue="{Binding myID, Mode=TwoWay}"
                          ItemsSource="{Binding Path=DataContext.myList, 
                          RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <ComboBox DisplayMemberPath="Value" SelectedValuePath="Key" IsEnabled="False"
                          SelectedValue="{Binding myID, Mode=TwoWay}"
                          ItemsSource="{Binding Path=DataContext.myList, 
                          RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
      </DataGridTemplateColumn>
    </DataGrid>
    View Code
  • 相关阅读:
    回答提出的问题1-17章
    《构建之法》第13-17章读书笔记
    读《一个程序员的生命周期》有感
    构建之法的第十、十一、十二章读书笔记
    阅读《构建之法》第8,9,10章
    5.2-5.3
    作业5.1测试与封装
    读《构建之法》5.6.7 思考
    读《构建之法》的思考
    作业2 结对思则运算
  • 原文地址:https://www.cnblogs.com/shawnzxx/p/3100147.html
Copyright © 2011-2022 走看看