所以我有一个绑定到客户端对象的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();
}
}
}
答案 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,并且在一个地方所做的更改应该反映在另一个地方。