gpt4 book ai didi

c# - Master/Detail MVVM 中的 Wpf Combobox

转载 作者:行者123 更新时间:2023-11-30 18:44:39 26 4
gpt4 key购买 nike

我有这样的 MVVM 主/详细信息:

<Window.Resources>
<DataTemplate DataType="{x:Type model:EveryDay}">
<views:EveryDayView/>
</DataTemplate>

<DataTemplate DataType="{x:Type model:EveryMonth}">
<views:EveryMonthView/>
</DataTemplate>
</Window.Resources>

<Grid>
<ListBox Margin="12,24,0,35" Name="schedules"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Elements}"
SelectedItem="{Binding Path=CurrentElement}"
DisplayMemberPath="Name" HorizontalAlignment="Left" Width="120"/>
<ContentControl Margin="168,86,32,35" Name="contentControl1"
Content="{Binding Path=CurrentElement.Schedule}" />
<ComboBox Height="23" Margin="188,24,51,0" Name="comboBox1"
VerticalAlignment="Top"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Schedules}"
SelectedItem="{Binding Path=CurrentElement.Schedule}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValue="{Binding Path=CurrentElement.Schedule.ID}"/>
</Grid>

这个窗口有 DataContext 类:

public class MainViewModel : INotifyPropertyChanged {
public MainViewModel() {
elements.Add(new Element("first", new EveryDay("First EveryDay object")));
elements.Add(new Element("second", new EveryMonth("Every Month object")));
elements.Add(new Element("third", new EveryDay("Second EveryDay object")));

schedules.Add(new EveryDay());
schedules.Add(new EveryMonth());
}

private ObservableCollection<ScheduleBase> _schedules = new
ObservableCollection<ScheduleBase>();
public ObservableCollection<ScheduleBase> Schedules {
get {
return _schedules;
}

set {
schedules = value;
this.OnPropertyChanged("Schedules");
}
}

private Element _currentElement = null;
public Element CurrentElement {
get {
return this._currentElement;
}

set {
this._currentElement = value;
this.OnPropertyChanged("CurrentElement");
}
}

private ObservableCollection<Element> _elements = new
ObservableCollection<Element>();
public ObservableCollection<Element> Elements {
get {
return _elements;
}

set {
elements = value;
this.OnPropertyChanged("Elements");
}
}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName) {
PropertyChangedEventHandler handler = PropertyChanged;

if (handler != null) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}

#endregion
}

其中一个 View :

<UserControl x:Class="Views.EveryDayView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid >
<GroupBox Header="Every Day Data" Name="groupBox1" VerticalAlignment="Top">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBox Name="textBox2" Text="{Binding Path=AnyDayData}" />
</Grid>
</GroupBox>
</Grid>

我在 ComboBox 中的 SelectedItem 不能正常工作。我的代码中是否存在任何明显的错误?

最佳答案

我通常做的是将 ItemsControl 的项目绑定(bind)到 ICollectionView(通常是 ListCollectionView),而不是直接绑定(bind)到集合;我认为这就是 ItemsControl 默认情况下所做的(创建默认 ICollectionView),但我可能错了。

无论如何,这允许您使用 ICollectionViewCurrentItem 属性,它会自动与 ItemsControl 中的所选项目同步(如果控件的 IsSynchronizedWithCurrentItem 属性为 true 或 null/default)。然后,当您需要 ViewModel 中的当前项目时,您可以使用它来代替。您还可以使用 ICollectionView 上的 MoveCurrentTo... 方法设置所选项目。

但是当我重新阅读这个问题时,我意识到你可能完全有另一个问题;您有一组“默认”项目,需要一种方法将它们与特定实例相匹配。然而,覆盖对象的相等运算符以认为它们在同一类型时始终相等是一个坏主意,因为这有可能使其他代码非常困惑。我会考虑将类型信息提取到枚举中,并在每个返回枚举值之一的对象上放置一个只读属性。然后,您可以将项目绑定(bind)到枚举值的集合,并将所选项目绑定(bind)到每个对象的枚举属性。

如果您需要示例,请告诉我,我可能把解释弄得一团糟:)

关于c# - Master/Detail MVVM 中的 Wpf Combobox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com