【发布时间】:2018-06-07 12:30:33
【问题描述】:
SO 社区,请多多包涵,因为我是新手,我还在(慢慢地)学习。我试图在网络上实施所有潜在的解决方案,但没有成功。我想我已经完全把自己与 DependencyMethods、DependencyProperties、RelayCommands、ICommand、BaseViewModels 等混淆了......
这是我的场景...我有一个 MainWindow(MainWindow) 和一个包含 UserControl(SampleUC) 的 Frame。 MainWindow 和 UserControl DataContext 指向它们各自的 ViewModel(MainWindowVM、SampleUCVM)。 MainWindowVM 和 SampleUCVM 是基本 ViewModel(BASEVM) 的子级,它通过 ObservableCollection 辅助类使用 INotifyPropertyChanged。 SampleUC 内部有一个 Combobox,它保存 SampleUCVM 中使用“fillFacility”方法构造的设施 ObservableCollection,并在使用“GetFacilityNum()”方法在 Combobox 中选择时存储 SelectedFacilityNum。
我想从 SampleUCVM 中提取方法“fillFacility”和“GetFacilityNum”,并将它们放在 BASEVM 或单独的类中,以便其他 ViewModel 可以访问和使用它们。它们将在我的整个项目中反复使用。有人可以向我解释如何做到这一点吗?感谢您的所有帮助和耐心!
SampleUC.xaml
<Grid>
<Label Content="Facility" HorizontalAlignment="Left" Margin="10,32,0,0" VerticalAlignment="Top" Width="87" Height="27"/>
<ComboBox Name="cboFacilities"
HorizontalAlignment="Left" Margin="119,37,0,0" VerticalAlignment="Top" Width="120"
DisplayMemberPath="FacilityName"
SelectedValuePath="FacilityName"
ItemsSource="{Binding Facilities}"
SelectedValue="{Binding SelectedFacility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
</Grid>
UCVM 示例
public class SampleUCVM : BASEVM
{
#region MySQL Connection
const string dbConnectionString = @"datasource=localhost;port=3306;Initial Catalog='optest1a1';username=root;password=";
#endregion
private ObservableCollection<Facilities> _facilitiesList;
private string _selectedFacility;
private int _selectedFacilityNum;
public ObservableCollection<Facilities> Facilities
{
get { return _facilitiesList; }
set
{
SetProperty(ref _facilitiesList, value, () => Facilities);
}
}
public string SelectedFacility
{
get { return _selectedFacility; }
set
{
SetProperty(ref _selectedFacility, value, () => SelectedFacility);
if (_selectedFacility != null)
{
GetFacilityNum();
}
}
}
public int SelectedFacilityNum
{
get { return _selectedFacilityNum; }
set { SetProperty(ref _selectedFacilityNum, value, () => SelectedFacilityNum); }
}
public SampleUCVM()
{
Facilities = new ObservableCollection<Facilities>();
fillFacilities();
}
private void fillFacilities()
{
using (MySqlConnection con = new MySqlConnection(dbConnectionString))
{
Facilities = new ObservableCollection<Facilities>();
con.Open();
string Query = "SELECT * FROM facilities";
MySqlCommand createCommand = new MySqlCommand(Query, con);
MySqlDataReader dr = createCommand.ExecuteReader();
int count = 1;
while (dr.Read())
{
string FacilityName = dr.GetString(1);
Facilities facilityname = new Facilities(count, FacilityName);
Facilities.Add(facilityname);
count++;
}
con.Close();
}
}
private void GetFacilityNum()
{
if (SelectedFacility != null)
{
using (MySqlConnection con = new MySqlConnection(dbConnectionString))
{
con.Open();
string Query = "SELECT Facility_ID_Num FROM facilities WHERE Facility_Name='" + SelectedFacility + "' ";
MySqlCommand createCommand = new MySqlCommand(Query, con);
MySqlDataReader dr = createCommand.ExecuteReader();
int count = 1;
while (dr.Read())
{
int FacilityNum = dr.GetInt32(0);
SelectedFacilityNum = FacilityNum;
count++;
}
con.Close();
}
}
}
}
BASEVM
public class BASEVM : ObservableObject
{
public BASEVM()
{
}
}
【问题讨论】:
-
你的问题太宽泛了,有很多可能的答案。也就是说:恕我直言,VM应该非常简单,尤其是当程序本身变得更加复杂时。目前尚不清楚在视图模型之间共享与“设施”相关的代码有何用处,但根据您在此处发布的内容,代码似乎更有可能完全属于不同的类。然后,任何需要该功能的视图模型类都可以拥有该不同类的实例,而不是成为具有该功能的类的实例。