Pregunta

Soy muy nuevo en WPF y probar algunas cosas que me gustaría incluir en una aplicación que estaré trabajando. Tengo un ListView 2 filas (unido 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 tengo que rellenar el cuadro de texto. Quiero ser capaz de editar el texto y la ficha fuera y tienen el ListView actualiza.

Editar . Quité el código ya que en realidad no añade nada a la pregunta

¿Fue útil?

Solución

Vaya, es realmente complicado de lo que tienes ahí.

Esto se puede lograr de una manera muy sencilla. Es necesario un modelo para representar el programador, un modelo de vista de mantener una lista de los programadores, y 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. Hay que encapsular el nombre dentro de un objeto porque las cadenas son inmutables en .NET. Si se trató de unión frente a una sola cadena en una lista de cadenas, los cambios no se propagarían.

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

public sealed class ViewModel
{
    public ObservableCollection<Programmer> Programmers { get; private set; }

    public ViewModel()
    {
        Programmers = new ObservableCollection<Programmer>();
    }
}

El modelo de vista se establece como el DataContext de nuestra vista. El DataContext fluye hacia abajo el árbol visual, y que puede unirse en contra de ella 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();
}

Se puede configurar los DataContext en cualquier forma que desee; Lo estoy haciendo aquí por razones de simplicidad.

En la interfaz de usuario, simplemente se unen ListView con la lista de programadores en el modelo de vista (el DataContext, a menos que se indique lo contrario, es la raíz de la ruta de enlace). Entonces se unen el cuadro de texto en contra de la SelectedItem del ListBox. Se selecciona un programador de la lista, que luego se convierte en el SelectedItem, que luego 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.

Otros consejos

Estos trabajos (excepto que necesita para validar el cuadro de texto ya que se puede introducir cualquier texto .. una lista desplegable podría ser una mejor opción).

Ver:

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

modelo de vista:

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; }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top