ListView更改源值保持所选项目处于活动状态除非我还原我的更改

时间:2016-07-12 21:17:43

标签: c# wpf xaml listview

所以我有一个绑定到客户端对象的ListView。客户端属性显示在ListView旁边的某个文本框中。如果我更改名称(显示在ListView中),除非我还原名称,否则我无法选择其他任何名称。

如果我更改文本框中的值并且文本框都显示相同的值,则ListView SelectedItem始终保持选中状态,即使我选择了另一个值。

我尝试清除所选项目,ItemsSource什么都行不通。它必须是源和绑定的东西。

My Source是我在这里找到的ObservableDictionary,所以也许这就是问题所在。我的客户端对象也是实现INotifyPropertyChanged。我尝试了Binding等等很多东西。但无论我尝试什么文本Box都会保持这样,即使我选择了其他东西,只要价值不是恢复到它的原始价值我能&可以#39; t选择其他任何东西。

XAML

  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="10"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="10"/>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
        <ColumnDefinition Width="10"/>
    </Grid.ColumnDefinitions>

    <ListView x:Name="listView" Grid.RowSpan="7" Grid.Row="1" Margin="5,0" SelectionMode="Single" IsSynchronizedWithCurrentItem="True">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ClientIDandName}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

    <TextBlock Text="ID" Grid.Row="1" Grid.Column="1"/>
    <TextBox Text="{Binding SelectedItem.ClientID, ElementName=listView}" IsEnabled="False"  Grid.Row="1" Grid.Column="2"/>
    <TextBlock Text="Nom" Grid.Row="2" Grid.Column="1"/>
    <TextBox Text="{Binding SelectedItem.ClientName, ElementName=listView}" Grid.Row="2" Grid.Column="2"/>
    <TextBlock Text="Temps de Transit" Grid.Row="3" Grid.Column="1"/>
    <TextBox Text="{Binding SelectedItem.TransitTime, ElementName=listView}" Grid.Row="3" Grid.Column="2"/>
    <TextBlock Text="Nbr. de Jour Max" Grid.Row="4" Grid.Column="1"/>
    <TextBox Text="{Binding SelectedItem.MaxShipDays, ElementName=listView}" Grid.Row="4" Grid.Column="2"/>
    <TextBlock Text="Exclure" Grid.Row="5" Grid.Column="1"/>
    <CheckBox IsChecked="{Binding SelectedItem.IsExcluded, ElementName=listView}" Grid.Row="5" Grid.Column="2" VerticalAlignment="Bottom"/>

    <Button x:Name="btnSave" Content="Sauvegarder" Click="btnSave_Click" Grid.Row="7" Grid.Column="1" Grid.ColumnSpan="2" HorizontalAlignment="Center"/>
</Grid>

背后的代码

    public partial class ClientConfig : UserControl
{
    public ClientConfig()
    {
        InitializeComponent();
        listView.ItemsSource = Client.LocalDB.Values.ToObservableCollection();
    }

    private void btnSave_Click(object sender, RoutedEventArgs e)
    {
        Client client = listView.SelectedItem as Client;

        if (client != null)
        {
            client.Save();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我通常使用MVVM设计模式并将我的对象保存在viewmodel中,因此您必须相应地修改代码。

我认为您的问题是如何在代码中创建ObservableCollection。当你调用ToObservableCollection()时,它会枚举Client.LocalDB.Values中的所有值,但我不认为它会像你期望的那样持久存在 - 特别是因为它是你的方法的本地正在创建它.ListView继续显示数据,因为没有任何东西告诉它改变,但ObservableCollection实际上不再存在。您将需要创建一个对整个类都是全局的可观察集合,并填充它。

这是未经测试的代码,但应该让你关闭...在代码背后:

private ObservableCollection<Whatever> _myCollection;
public ObservableCollection<Whatever> MyCollection
{
    get
    {
        return _myCollection;
    }
    set
    {
        if (_myCollection != value) 
        {
            _myCollection = value;
            RaisePropertyChanged("MyCollection");
        }
    }
}

private Whatever _selectedWhatever;
public Whatever SelectedWhatever
{
    get
    {
        return _selectedWhatever;
    }
    set
    {
        if (_selectedWhatever != value) 
        {
            _selectedWhatever = value;
            RaisePropertyChanged("SelectedWhatever");
        }
    }
}

public ClientConfig()
{
    InitializeComponent();
    foreach (Whatever whatevs in Client.LocalDB.Values.ToObservableCollection()) 
    {
        MyCollection.Add(whatevs); // populate the collection this way and it will persist
    }
}

并在XAML中:

<ListView x:Name="listView" Grid.RowSpan="7" Grid.Row="1" Margin="5,0" SelectionMode="Single" IsSynchronizedWithCurrentItem="True" ItemSource="{Binding MyCollection}" SelectedItem="{Binding SelectedWhatever}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ClientIDandName}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

请注意,您现在已将集合绑定到可以更改的持久变量,并且已将所选项绑定到该集合的特定实例。现在,您可以将文本框绑定到SelectedWhatever,并且在一个地方所做的更改应该反映在另一个地方。