DataGrid
및보기 모델 (MyViewModel1
)이 있습니다. DataGrid
은 Items 속성 MyViewModel1
에 바인딩됩니다. 제약 조건은 MyViewModel1
및 MyClass1
코드를 만질 수 없다는 것입니다.WPF DataGrid/ListView/ListBox에 계산 된 추가 열을 추가하는 방법
public class MyViewModel1 : INotifyPropertyChanged
{
...
public ObservableCollection<MyClass1> Items { get { ... } }
public int ViewModelProperty1 { get { ... } }
public int ViewModelProperty2 { get { ... } }
}
public class MyClass1 : INotifyPropertyChanged
{
...
public int Property1 { get { ... } }
public int Property2 { get { ... } }
public int Property3 { get { ... } }
}
나는 DataGrid
이 아니라 3 세 알려진 특성을 가진 열뿐만 아니라 Property1
, Property2
, Property3
, ViewModelProperty1
및 ViewModelProperty2
에 따라 각 행에 4 열을 보여 드리고자합니다. 예를 들어, 4 번째 열이 Property1 + Property2 + Property3 + ViewModelProperty1 + ViewModelProperty2
이라고 가정 해 봅시다. 4 번째 열에는 현재 값이 표시되어야하므로 ViewModelProperty1
이 1 씩 증가하면 4 번째 열도 1 씩 증가해야합니다. 내 질문은 : 이것을 할 수있는 나의 선택은 무엇입니까?
나는이 생각할 수 :
이 입력으로 모든 종속 변수와 함께
IMultiValueConverter
를 사용합니다. 이 예제에서는 잘 작동합니다. 여기서 문제는 변수의 상호 작용이보다 복잡 해지면 곧바로((Property1 + 2*Property2) * Property3)^(ViewModelProperty1 - ViewModelProperty2)
의 경우 5 개의 변수가 'MultiBinding'에 배치되는 순서가 중요 해지고 바인딩에 많은 지식이있어 솔루션이 취약해질 수 있습니다.래퍼를 사용하십시오.
MyViewModel1
에 변화에 등록하는 새로운 클래스MyViewModel2
,에DataGrid
바인딩 및
문제는 제가 위에서 언급 한 2 외에 추가로이 문제를 해결하기 위해 존재하는 어떤 방법입니다public class MyViewModel2 { public MyViewModel2(MyViewModel1 m) { ... } ... public ObservableCollection<MyClass2> Items { get { ... } } } public class MyClass2 : INotifyPropertyChanged { public MyClass2(MyClass1 inner) { InnerClass = inner; InnerClass.NotifyPropertyChanged += InnerClassChanged; } void InnerClassChanged(object o, PropertyChangedEventArgs) { if (PropertyChanged != null) PropertyChanged("Property4"); } public void ViewModelPropertiesChanged { if (PropertyChanged != null) PropertyChanged("Property4"); } public MyClass1 InnerClass { get; private set; } public int Property4 { get { return InnerClass.Property1+InnerClass.Property2 ... } } public event PropertyChanged; }
(컨버터 같이 보입니다 및 래퍼).
내 질문에 어떤 식 으로든이 예제를 해결하는 가장 좋은 방법은 아닙니다.
정말 깨끗 다른 방법이 없습니다 (예 : 당신은 코드 숨김에 결합 된 데이터 필드를 둘 수 있었다). 그러나 다중 값 변환기가 값 변환을 수행하기 위해 다른 오브젝트를 호출 할 수 있다는 점은 유의할 가치가 있습니다. 잠재적 인 비즈니스 로직을 일부 공유 클래스로 다시 가져 가면 "부서지기 쉬운"상태가 될 수 있습니다. –