1

我有一个未知的变量列表,希望绑定到 WPF 应用程序中的特定控件。有没有办法将列表中的变量绑定到特定名称?

这是我正在尝试做的代码示例。

C#

public class Variable {
    public string Name {get;set;}
}

public class VariableViewModel : INotifyPropertyChanged {
    Variable _variable;
    public Variable Variable {
        get {
            return(_variable);
        }
        set {
            _variable = value;
            if(PropertyChanged != null) {
                PropertyChanged(this, new PropertyChangedEventArgs("Variable"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

public class VariableListViewModel {
    public ObservableCollection<VariableViewModel> VariableList { get; set; }

    public VariableListViewModel() {
        VariableList = new ObservableCollection<VariableViewModel>();
        var variableViewModel = new VariableViewModel { 
            Variable = new Variable { Name = "my_variable_name" } 
        };
        VariableList.Add(variableViewModel);
    }
}

WPF:

<Window>
    <Window.DataContext>
        <local:VariableListViewModel />
    </Window.DataContext>

    <StackPanel>
        <Label Content="{Binding Path=Name, ElementName=my_variable_name}" />
    </StackPanel>
</Window>

这里的标签显然是错误的。我的问题是我想要实现的目标是否可行?我希望能够显示“my_variable_name”。

-斯图尔特

4

4 回答 4

2

您通常会使用ListView(或其他ItemsControl),并将其绑定ItemsSource到您的集合(VariableList)。

这将导致显示每个项目 (a VariableViewModel)。然后,您将使用 aDataTemplate使VariableViewModel显示为绑定到 的标签Variable.Name

于 2012-08-16T16:38:44.613 回答
2

您可以使用 aValueConverter并使用它的 ConverterParameter 来传递变量的名称:

public object ConvertTo(object value, Type targetType, object parameter, CultureInfo culture)
{
    var variableList = (IEnumerable<Variable>)value;
    var variableName = parameter != null ? parameter.ToString() : string.Empty;
    return variableList.FirstOrDefault(v=>v.Name == variableName);
}

然后,您可以在 XAML 中使用该转换器,如下所示:`

<Label Content="{Binding Path=ListOfVariables, 
                         Converter={StaticResource VariableConverter}, 
                         ConverterParameter='VariableName'}" />
于 2012-08-16T16:43:06.273 回答
1

你的问题自相矛盾。

一方面你说你有一个未知的变量列表,另一方面你的视图知道它想要绑定哪些变量。

因此,您要么知道要绑定哪些变量,要么不知道。

场景 1:您知道要绑定哪些变量:

在 ViewModel 中为每个变量创建一个属性

场景 2:您不知道要绑定到哪些变量:

VariableList将您的属性绑定到ItemsControl视图中的 an 并提供DataTemplate可以呈现VariableViewModel.


顺便说一句:拥有一个VariableViewModel似乎是多余的。可以Variable直接使用。尤其是当一切VariableViewModel都回归Variable内部时。

于 2012-08-16T16:40:21.547 回答
1

基于 Reeds 解决方案和评论,这是我的最终解决方案。我使用了相同的模型和视图模型,所以我只会显示视图。

<Window>
    <Window.DataContext>
        <local:VariableListViewModel />
    </Window.DataContext>

    <Window.Resources>
        <DataTemplate x:Key="itemsControlDataTemplate">
            <Label x:Name="label" Content="{Binding Variable.Name}">
                <Label.Style>
                    <Style TargetType="{x:Type Label}">
                        <Setter Property="Visibility" Value="Collapsed" />
                        <Style.Triggers>
                            <Trigger Property="Content" Value="my_variable_name">
                                <Setter Property="Visibility" Value="Visible" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Label.Style>
            </Label>
        </DataTemplate>
    </Window.Resources>

    <StackPanel>
        <ItemsControl ItemTemplate="{StaticResource itemsControlDataTemplate}" ItemsSource="{Binding Path=VariableList}" />
    </StackPanel>
</Window>
于 2012-08-16T19:19:21.687 回答