Связывание данных между графическим интерфейсом WPF и парой ListBox / CheckBox - PullRequest
0 голосов
/ 04 декабря 2010

То, что я хочу сделать, выглядит легко, но отнимает у меня много времени без какого-либо результата .. = / Я хотел бы иметь окно WPF, которое берет объект с некоторыми свойствами и использует его для добавления парывещь.В конкретном случае получаемый объект так определен:

public class ParameterForGraphicOptions
{
    public List<VariablesOptions> Variables { get; set; }
    public List<string> Simulations { get; set; }
    public List<string> ShowSimulations { get; set; }
}
public class VariablesOptions
{
    public string Name { get; set; }
    public bool Show { get; set; }
    public bool Average { get; set; }
    public bool Var { get; set; }
}

И я хотел бы заполнить 2 ListBox симуляциями и ShowSimulations, а также иметь другой список, который связан с именем переменной и 3 флажком, которые меняютсяих значения при изменении выбранного элемента в списке. Код Windows (.cs):

public GraphicOptions(ParameterForGraphicOptions pfgo) //NAME OF THE WINDOW
{
    InitializeComponent();                     //STD CALL
    this.DataContext = pfgo;                   //CONNECTING THE DATA CONTEXT
}

Код XAML для привязки следующий:

<Window x:Class="GUI.GraphicOptions"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="GraphicOptions" Height="450" Width="350">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25" />
            <RowDefinition Height="150"/>
            <RowDefinition Height="25" />
            <RowDefinition Height="150"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25" />
            <RowDefinition Height="11*" />
        </Grid.RowDefinitions>
        <Label Grid.Row="0">Simulation in Progress</Label>
        <Label Margin="188,0,0,0">Simulation to Show</Label>
        <ListBox Grid.Row="1" Height="150" HorizontalAlignment="Left" Name="Simulations" VerticalAlignment="Top" Width="140" />  
        <ListBox Grid.Row="1" Height="150" HorizontalAlignment="Left" Margin="188,0,0,0" Name="SimulationsToShow" VerticalAlignment="Top" Width="140" />
        <Label Grid.Row="2">Variables to Show</Label>

        <ListBox Grid.Column="0" Grid.Row="3" DataContext="{Binding Variables.Name}" Height="150" HorizontalAlignment="Left" Name="Variables" VerticalAlignment="Top" Width="140"  Grid.RowSpan="2" />
        <CheckBox Grid.Row="3" Content="Show" IsChecked="{Binding Variables.Show}"  Height="20" HorizontalAlignment="Left" Name="Show" VerticalAlignment="Top" Width="76" Margin="163,5,0,0" />
        <CheckBox Grid.Row="3" Content="Average" IsChecked="{Binding Variables.Average}"  Height="25"  HorizontalAlignment="Left" Name="Average" VerticalAlignment="Top" Width="76" Margin="174,54,0,0" Checked="Average_Checked" />
        <CheckBox Grid.Row="3" Content="Var" IsChecked="{Binding Variables.Var}" Height="25"  HorizontalAlignment="Left" Name="Variance" VerticalAlignment="Top" Width="76" Margin="163,31,0,0" />
        <CheckBox Content="Refresh Graphic During Computation" Grid.Row="5" Height="25" HorizontalAlignment="Left" Name="Continuos" VerticalAlignment="Top" Width="220" />
        <Button Content="Save" Grid.Row="5" Height="23" HorizontalAlignment="Left" Margin="253,1,0,0" Name="Save" VerticalAlignment="Top" Width="75" Click="Save_Click" />
        <Button Content="->" Grid.Row="1" Height="35" HorizontalAlignment="Left" Margin="145,30,0,0" Name="OneSimulation" VerticalAlignment="Top" Width="35" />
        <Button Content="=>" Grid.Row="1" Height="35" HorizontalAlignment="Left" Margin="145,65,0,0" Name="AllSimulation" VerticalAlignment="Top" Width="35" />
    </Grid>
</Window>

Я пыталсяразными способами, но всегда связывают только элемент, поэтому я не могу понять, КАК эта библиотека работает .. Большое спасибо 4 всем: P

Вопрос: есть ли какая-то неправильная вещь в коде, который я разместил?

PS: Извините за мой английский: P

1 Ответ

1 голос
/ 05 декабря 2010

Не связывайте один элемент управления с множественными элементами. Связать с одним выбранным элементом.

Вот правильное решение:

<ListBox x:Name="vars" ItemsSource="{Binding Variables}" DisplayMemberPath="Name" />
<CheckBox IsChecked="{Binding SelectedItem.Show, ElementName=vars, Mode=TwoWay}" />
<CheckBox IsChecked="{Binding SelectedItem.Average, ElementName=vars, Mode=TwoWay}" />
<CheckBox IsChecked="{Binding SelectedItem.Var, ElementName=vars, Mode=TwoWay}" />
...