Soy muy nuevo en WPF y probar algunas cosas que me gustaría incluir en una aplicación que voy a estar trabajando. Tengo un fila 2 ListView (vinculado a un cuadro de texto) con los nombres de Scott Guthrie y Jon Skeet en ella. Estoy tratando de seleccionar «Scott Guthrie» en el ListView y tienen que rellenar el cuadro de texto. Quiero ser capaz de editar el texto y la ficha y el ListView actualizado.

Editar:he quitado el código, ya que realmente no aportan nada a la cuestión.

  • eso es demasiada información 🙂 sólo para la próxima vez
InformationsquelleAutor Nick U | 2010-12-25

2 Comentarios

  1. 31

    Wow, eso es muy complicado lo tienes aquí.

    Esto se puede lograr de una manera muy sencilla. Se necesita un modelo para representar el programador, un modelo de vista para que mantenga una lista de los programadores, y la simple unión a cuidar de los demás.

    El modelo:

    public sealed class Programmer
    {
        public string Name { get; set; }
    }

    Es muy simple. Un objeto que representa un programador con un nombre. Debemos encapsular el nombre dentro de un objeto debido a que las cadenas son inmutables en .NET. Si has tratado de unión en contra de una sola cadena en una lista de cadenas, cambios no se propagan.

    La colección de programadores se mantiene en un ViewModel. En este caso, yo lo llamo ViewModel, debido a que no tengo imaginación. Este modelo de vista contiene todo lo que la vista se une en contra. En este caso, su número de la lista de los programadores.

    public sealed class ViewModel
    {
        public ObservableCollection<Programmer> Programmers { get; private set; }
    
        public ViewModel()
        {
            Programmers = new ObservableCollection<Programmer>();
        }
    }

    El ViewModel se establece como el DataContext de nuestro punto de vista. El DataContext fluye hacia abajo en el árbol visual, y que podemos unir en su contra en cualquier momento.

    public MainWindow()
    {
        var vm = new ViewModel();
        vm.Programmers.Add(new Programmer { Name = "Jon Skeet" });
        vm.Programmers.Add(new Programmer { Name = "Scott Guthrie" });
        DataContext = vm;
        InitializeComponent();
    }

    Puede establecer el DataContext en cualquier manera que usted quiera; yo estoy haciendo aquí para simplificar.

    En la interfaz de usuario, simplemente enlazar el ListView en contra de la lista de los Programadores en el ViewModel (el DataContext, a menos que se indique lo contrario, es la raíz de la ruta de enlace). Yo, a continuación, enlazar el cuadro de texto en contra de la SelectedItem del ListBox. Selecciona un Programador de la lista, que luego se convierte en el SelectedItem, que yo continuación, puede cambiar el Nombre de.

    <Window
        x:Class="Programmers.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:t="clr-namespace:Programmers"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <ListBox
                x:Name="list"
                ItemsSource="{Binding Programmers}"
                DisplayMemberPath="Name" />
            <TextBox
                Grid.Column="1"
                VerticalAlignment="Top"
                Text="{Binding SelectedItem.Name, ElementName=list}" />
        </Grid>
    </Window>

    Simple, una vez que el cuelgue de ella.

    • Sí, parece que el saber es la mitad de la batalla. Gracias! Que lo hizo!
    • GI Joooooeeeeeeeeeeeeeeeee!
    • +1. Gracias hombre, lo que realmente me ayudó! He utilizado list.ItemSource = vm en lugar de DataContext = vm aunque. Creo que tengo demasiado cuando tengo varios de la lista, pero no estoy seguro porque soy nuevo en WPF.
    • Pequeña nota, ya que el OP se le preguntó acerca ListView y esta solución es para ListBox: ListView es una subclase de ListBox, por lo que este código funciona bien para ambos.
  2. 5

    Esto funciona (salvo que usted necesita para validar el textbox ya que puede introducir cualquier texto.. un desplegable podría ser una mejor opción).

    Vista:

    <TabItem x:Name="RightTabPage" Header="RightModel"  DataContext="{Binding Right}">
                        <StackPanel>
                            <TextBox Text="{Binding SelectedGuru}"/>
                            <ListView SelectedItem="{Binding SelectedGuru}" ItemsSource="{Binding Gurus}"/>
                        </StackPanel>
                    </TabItem>

    ViewModel:

    public class RightViewModel
        {
            public RightViewModel()
            {
                Gurus = new[] {"Scott Guthrie", "Jon Skeet"};
                SelectedGuru = Gurus.First();
            }
    
            public string SelectedGuru { get; set; }
            public IEnumerable<string> Gurus{ get; set; }
        }

Dejar respuesta

Please enter your comment!
Please enter your name here