我正在尝试使用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}" />
这个选项为我提供了完整的模型,这对我的特殊情况更有用。
答案 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中。