SO 커뮤니티, 초보자이며 아직 배우고 있습니다 (천천히). 나는 그물에있는 모든 잠재적 인 해결책을 성공없이 구현하려했습니다. 나는 DependencyMethods, DependencyProperties, RelayCommands, ICommand, BaseViewModels 등등과 완전히 자신을 혼란스럽게 생각합니다.WPF/MVVM 추상 일반적인 방법
여기 내 시나리오가 있습니다. 프레임이 포함 된 MainWindow (MainWindow)를 가지고 있습니다. UserControl (SampleUC). MainWindow 및 UserControl DataContext는 각각의 ViewModel (MainWindowVM, SampleUCVM)을 가리 킵니다. MainWindowVM 및 SampleUCVM은 ObservableCollection 도우미 클래스를 통해 INotifyPropertyChanged를 사용하는 Base ViewModel (BASEVM)의 자식입니다. SampleUCVM에 생성 된 Facilities ObservableCollection을 메서드 "fillFacility"와 함께 보유하고 Combobox에서 "GetFacilityNum()"메서드로 선택된 경우 SelectedFacilityNum을 저장하는 SampleUC 안에는 Combobox가 있습니다.
SampleUCVM에서 "fillFacility"및 "GetFacilityNum"메소드를 추출하여 BASEVM 또는 다른 ViewModels에서 액세스하여 사용할 수있는 별도의 클래스에 배치하고 싶습니다. 그들은 내 프로젝트에서 반복적으로 사용될 것입니다. 누군가이 일을 어떻게 설명 할 수 있겠습니까? 모든 도움과 인내심에 감사드립니다!
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>
SampleUCVM
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()
{
}
}
귀하의 질문은 너무 광범위하여 가능한 많은 답변을 가지고 있습니다. 즉 : IMHO VM은 프로그램 자체가 복잡 해짐에 따라 특히 간단해야합니다. "시설"관련 코드를 뷰 모델간에 공유하는 것이 얼마나 유용한 지 분명하지 않지만 여기에 게시 한 내용에 따라 코드가 모두 다른 클래스에 속할 가능성이 더 높습니다. 그런 다음 해당 기능을 필요로하는 뷰 모델 클래스는 해당 기능을 가진 클래스의 인스턴스가 아닌 해당 다른 클래스의 인스턴스를 가질 수 있습니다. –