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

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 に答える
2

通常はListView (またはその他) を使用し、それをコレクション ( ) にItemsControlバインドします。ItemsSourceVariableList

これにより、各項目 (a VariableViewModel) が表示されます。DataTemplate次に、 aを使用して、をVariableViewModelにバインドされたラベルとして表示しVariable.Nameます。

于 2012-08-16T16:38:44.613 に答える
1

リードの解決策とコメントに基づいて、これが私の最終的な解決策です。同じモデルとビューモデルを使用したので、ビューのみを表示します。

<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 に答える
1

あなたの質問は矛盾しています。

一方では、変数の未知のリストがあると言いますが、他方では、ビューはバインドする変数を知っています。

したがって、バインドする変数を知っているか、知らないかのどちらかです。

シナリオ 1: バインドする変数がわかっている場合:

ViewModel で変数ごとにプロパティを作成する

シナリオ 2: バインド先の変数がわからない場合:

VariableListプロパティをItemsControlView 内の にバインドしDataTemplate、 をレンダリングできるを提供しますVariableViewModel


ところで:持つVariableViewModelことは不必要なようです。直接使用できますVariable。特にすべてVariableViewModelが内側に戻っているときVariable

于 2012-08-16T16:40:21.547 に答える