在Silverlight中存储ID字段的位置

时间:2010-04-30 16:20:58

标签: silverlight mvvm

我正在尝试使用MVVM模式,我想知道我在哪里放置ID值。我是否创建了一个将其可见性属性设置为折叠的TextBlock?或者有更好的地方存储这种数据?目前,命令参数设置为:

CommandParameter="{Binding ElementName=Name,Path=Text}"

但我宁愿它是这样的:

CommandParameter="{Binding ElementName=Id,Path=Text}"

我完全有能力提出最佳方法,因为我是这种模式和表达语言的新手。

<ListBox x:Name="MyListBox" ItemsSource="{Binding MyData, Mode=TwoWay}" BorderThickness="0">        
    <ListBox.ItemTemplate>                
        <DataTemplate>
             <StackPanel Orientation="Horizontal">
                 <CheckBox x:Name="Visible" IsChecked="{Binding Visible, Mode=TwoWay}" Command="{Binding ElementName=MyListBox, Path=DataContext.MyCommand}" CommandParameter="{Binding ElementName=Name,Path=Text}" />
                 <TextBlock Text="{Binding Name}" />
              </StackPanel>  
               </DataTemplate>
    </ListBox.ItemTemplate>            
</ListBox>

编辑:选项1

<CheckBox x:Name="Visible" IsChecked="{Binding Visible, Mode=TwoWay}" Command="{Binding ElementName=MyListBox, Path=DataContext.MyCommand}" CommandParameter="{Binding Id}" />

这个选项只给我ID,这在很多情况下很有用。

编辑:选项2

   <CheckBox x:Name="Visible" IsChecked="{Binding Visible, Mode=TwoWay}" Command="{Binding ElementName=MyListBox, Path=DataContext.MyCommand}" CommandParameter="{Binding}" />

这个选项为我提供了完整的模型,这对我的特殊情况更有用。

1 个答案:

答案 0 :(得分:1)

您要做的是将您的Id保留在项目源集合中的数据对象中。只需将单个项目绑定到ui列表中每个项目的stackpanel:

<StackPanel Orientation="Horizontal" DataContext="{Binding}"> 
    <CheckBox x:Name="Visible" IsChecked="{Binding Visible, Mode=TwoWay}" Command="{Binding ElementName=MyListBox, Path=DataContext.MyCommand}" CommandParameter="{Binding ElementName=Name,Path=Text}" /> 
    <TextBlock Text="{Binding Name}" /> 
</StackPanel>

注意DataContext =“{Binding}”。此语法将整个项目对象绑定到属性,而不是对象的属性。现在,无论你有什么编程代码用于复选框等,你都会有一个复选框的引用,你可以转到父堆栈面板,访问DataContext属性,该属性将引用你的集合中的项目,从它们刚才检索id。

WPF / Silverlight绑定的优点在于,您不需要将数据公开/绑定到用户不需要的UI中。