如何在 MVVM 中将标志枚举绑定到列表框
我想将具有 flags 属性的枚举绑定到具有 mvvm 模式中的检查列表框项目模板的列表框?我该怎么做?
[Flags]
public enum SportTypes
{
None = 0,
Baseball = 1,
Basketball = 2,
Football = 4,
Handball = 8,
Soccer = 16,
Volleyball = 32
}
<ListBox Name="checkboxList2"
ItemsSource="{Binding Sports}"
Margin="0,5"
SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=SportTypeEnum, Converter={StaticResource enumBooleanConverter}}"
Content="{Binding Item}"/>
</DataTemplate>
</ListBox.ItemTemplate>
I want to bind an enum which has flags attribute to a listbox with a check list box item template in mvvm pattern? How can I do this?
[Flags]
public enum SportTypes
{
None = 0,
Baseball = 1,
Basketball = 2,
Football = 4,
Handball = 8,
Soccer = 16,
Volleyball = 32
}
<ListBox Name="checkboxList2"
ItemsSource="{Binding Sports}"
Margin="0,5"
SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=SportTypeEnum, Converter={StaticResource enumBooleanConverter}}"
Content="{Binding Item}"/>
</DataTemplate>
</ListBox.ItemTemplate>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您无法轻松地直接绑定该值,因为转换器无法从单个标志构建标志组合。因此,您需要管理标志的集合,并基于该集合构建组合。困难在于
ListBox.SelectedItems
属性是只读的。但是,这篇博文提供了一个很好的解决方法,使用附加属性。下面是使用此解决方案的完整示例:
代码隐藏
XAML
注意:为了简单起见,ViewModel 是 Window 类。在真正的 MVVM 应用程序中,您当然会使用单独的 ViewModel 类......
You can't easily bind the value directly, because the converter can't build the flag combination from a single flag. So you need to manage a collection of flags, and build the combination based on this collection. The difficulty is that the
ListBox.SelectedItems
property is readonly. However, this blog post gives a nice workaround, using an attached property.Here's a complete example using this solution :
Code-behind
XAML
NOTE: for the sake of simplicity, the ViewModel is the Window class. In a real MVVM application, you would of course use a separate ViewModel class...
我看到两种解决方案:一种是完全动态的,另一种是静态的。动态解决方案需要大量工作,而且在我看来并非微不足道。静态面板应该很简单:
在数据模板中创建一个面板。在其中,为每个标志值放置一个复选框。然后使用 ConverterParameter 指定转换器应使用的标志。这看起来像这样:
在你的转换器中,你只需要进行一些逻辑与比较,你就会得到你想要的东西。如果您对动态解决方案感兴趣,请发表评论,我可以给您一些从哪里开始的想法。但在我看来,这确实不是一件小事。
附加信息
如果您想要一个列表而不是 StackPanel,请在 Border 甚至 ListBox 中使用 ScrollViewer。
I see two solutions: One that is fully dynamic, and one that is static. The dynamic solution is a lot of work and IMO not trivial. The static one should be easy:
Create an Panel within your DataTemplate. There in, place for each Flag-Value a CheckBox. Then use the ConverterParameter to specifiy the flag, the converter should use. This would look something like this:
In your converter you only have to do some logical AND-comparisons and you will have what you're looking for. If you're interested in the dynamic solution, make a comment, I can give you some ideas where to start. But IMO this will really not be trivial.
Additonal info
If you want to have a list instead of the StackPanel, use a ScrollViewer in a Border or even a ListBox.
为了扩展克里斯的帖子,这里更全面地解释了如何做到这一点。
这不是最理想的情况,因为保存枚举的属性必须比平常更复杂一些,但它是有效的。
转换器代码:
转换器的 XAML:
然后,为了绑定到此,我做了一些技巧以使转换器正常工作:
由于这种特殊的设置器逻辑,您可能希望包含这样的方法以允许您完全设置代码中的值:
To expand on Chris's post, here's a more thorough explanation of how you can do this.
This isn't the most ideal scenario, as the property holding the enum has to be a bit more complex than usual, but it works.
Converter code:
XAML for converter:
Then, to bind to this, I did a bit of trickery to get the converter to work properly:
Because of this special setter logic, you probably want to include a method like this to allow you to fully set the value from code: