【问题标题】:Bind static data as dictionary key将静态数据绑定为字典键
【发布时间】:2017-10-31 22:51:11
【问题描述】:

如何将字典静态数据绑定为字典键?
我的 XAML 代码:

<TextBlock
    x:Name="AxisXTextBlock"
    Width="37"
    Height="18"
    Margin="106,19,0,0"
    HorizontalAlignment="Left"
    VerticalAlignment="Top"
    FontFamily="Source Code Pro"
    Text="{Binding DataStructure.DictionaryOfValuesReadOnly[AXIS_X].IntValue, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
    TextWrapping="Wrap" />

字典键的静态数据类:

public static class DataNames
{
    public static string SomeDataName { get; } = "some_data_name";
    ...
}

如何在 XAML 代码中将 DataNames.SomeDataName 绑定为我的字典的键?

更新

我使用字典转换器,然后将其绑定为 StaticResource

xmlns:converters="clr-namespace:AppName.Converters"
...
<converters:SomeConverter x:Key="SomeConverter " />
...
Text="{Binding Path=DataStructure, Converter={StaticResource SomeConverter}, ConverterParameter={x:Static data:DataNames.SomeDataName}}"


感谢mm8 帮助解决问题。他的答案包含字典转换器的代码。

【问题讨论】:

  • 顺便说一句,如果您的BindingOneWay,那么将UpdateSourceTrigger 设置为PropertyChanged 毫无意义。
  • @dymanoid 哦,这是一个公平的评价。我在匆忙复制TextBlocks,忘记改变逻辑......谢谢你的评论
  • 如果您还需要设置兼容性,我找到了一个解决方案:stackoverflow.com/a/51750919/6229375

标签: c# wpf xaml binding


【解决方案1】:

恐怕 XAML 不支持这种“动态”绑定路径。

你可以使用转换器,例如:

public class DictConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        IDictionary<string, string> dict = value as IDictionary<string, string>;
        string key = parameter as string;

        string s;
        if (dict != null && !string.IsNullOrEmpty(key) && dict.TryGetValue(key, out s))
            return s;

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

<TextBlock Text="{Binding Path=Dict, Converter={StaticResource conv}, ConverterParameter={x:Static local:DataNames.AxisX}}" />

【讨论】:

    【解决方案2】:

    您可以使用静态标记扩展:

    <TextBlock
        x:Name="AxisXTextBlock"
        Background="Yellow"
        Width="100"
        Height="30"
        Margin="106,19,0,0"
        HorizontalAlignment="Left"
        VerticalAlignment="Top"
        FontFamily="Source Code Pro"
        Text="{Binding DataStructure.DictionaryOfValuesReadOnly[{x:Static local:DataNames.AxisX}].IntValue, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
        TextWrapping="Wrap" />
    

    【讨论】:

    • 这看起来像是一个单独的问题。你在调试器中看到了什么键值?
    猜你喜欢
    • 2014-06-13
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2017-09-24
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多