댓글 리스트
-
답댓글 작성자 김예건 작성시간21.06.28 c00012 오류가 `factor = Convert.ToDouble(p.FourthBoxValue) ` 절에서 발생하는게 아닌가요?
Local 창에 Exception 에서 InnerException 이 보이도록 해주실 수 있으실까요? StackTrace 도 첨부해주시면 정확하게 볼 수 있을 거 같네요.
일단 `p.FourthBoxValue`가 string 타입이고 `Convert.ToDouble` 이 해석 못하는 string 값이 입력된게 아닌가 추측됩니다.
https://docs.microsoft.com/en-us/dotnet/api/system.convert.todouble?view=net-6.0
만약 바인딩 자체가 안되는거라고 한다면 Binding 하실 때 Path 즉 경로를 잘못 입력하신거라, XAML 또는 View 코드를 보여주셔야 원인 파악이 가능합니다. -
답댓글 작성자 김예건 작성시간21.06.28 c00012 ```
<MultiBinding Converter="{StaticResource PLConverter}">
<Binding ElementName="ProdBox" Path="Text"/>
<Binding ElementName="Lender" Path="Text"/>
<Binding ElementName="Amount" Path="Text"/>
<Binding ElementName="APR" Path="Text"/>
<Binding ElementName="Terms" Path="Text"/>
</MultiBinding>
```
`ElementName` 에 해당하는 Element가 올려주신 코드에는 안보이는데, 코드 길이를 줄이시려고 각 Element 를 XAML 에서 생략하신건가요? -
답댓글 작성자 김예건 작성시간21.06.29 c00012 그럼 MainWindow 에서 바인딩할 대상인 Element 를 이름으로 탐색을 하는데, MainWindow 는 생성될 때 'Ledger', 'Amount' 등 Element 를 알 수가 없는거군요. 그러면 바인딩이 제대로 연결되지 않습니다. 'PropertyChanged' 이벤트를 연결할 Element 가 Xaml 을 컴파일할 때 존재하지 않기 때문입니다. 만약 ContentControl 로 동적으로 UserControl 인 PersonalLoan 을 주입하는거라면 동적으로 바인딩을 생성해줘야 합니다. 차라리 PersonalLoanVM 을 DataContext 로 지정하셨으니 Element 가 아닌 ViewModel 과 바인딩하시는건 어떨까요? CommandParamter 를 넘기실 필요 없이 PersonalLoanVM 의 속성을 활용해서 커맨드를 실행시키면 됩니다
https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.data.binding.elementname?view=winrt-20348#remarks -
답댓글 작성자 김예건 작성시간21.06.29 c00012 코드로 설명하면,
TwoWay 바인딩으로 View 에서 데이터가 변경되면 ViewModel 의 데이터도 업데이트합니다.
```
// PersonalLoan
<TextBox x:Name="Lender" Text="{Binding Lender, Mode=TwoWay}" />
```
CommandParamter 는 주석처리합니다.
```
<Button>
<!--
<Button.CommandParameter>
</Button.CommandParameter>
-->
</Button>
```
CommandParamter 대신 ViewModel 의 데이터를 업데이트합니다.
```
private void ShowOffer()
{
// ViewModel 내부 변수 활용
}
```
지금 @c00012 님이 제공해주신 코드는 MVVM 패턴을 제대로 활용하지 못하고 있습니다. 위와 같이 개선하신다면 더 간결하고 클린하게 코드를 작성할 수 있습니다.구체적으로 설명을 하자면, 제공해주신 코드는 ViewModel 에 데이터를 View 에서 View 로 옮겼다가 다시 ViewModel 로 받게 설계되어 있습니다. -
답댓글 작성자 c00012 작성자 본인 여부 작성자 작성시간21.06.29 김예건 말씀하신 대로 다음과 같이 코드를 바꿨습니다.
해당 button의 command parameter를 없애고
그리고 PersonalLoan의 부분에서 모든 요소를 다음과 같이 바꿨습니다;
<TextBox x:Name="Lender" Text="{Binding Lender, Mode=TwoWay}" Grid.Row="0" Grid.Column="1" Margin="10" Height="30" FontFamily="Segoe UI" FontSize="18"/>
....
마지막으로
private void ShowOffer(object param) 부분도 내부변수로 바꾸고 compile했더니 binding failure는 나지 않는데 메시지 박스 자체가 안 뜨네요. 어떻게 된 건지 지적을 부탁드려도 될 까요? -
답댓글 작성자 c00012 작성자 본인 여부 작성자 작성시간21.06.29 김예건 그리고 MainViewmodel의 생성자를 다음과 같이 수정했습니다.
public MainViewModel()
{
foreach (object item in Enum.GetValues(typeof(ProdCode)))
{
ProdStrings.Add(item.ToString());
}
ProdSelectCommand = new RelayCommand<object>(p => ShowSelect(p));
PersonalLoanVM = new PersonalLoanViewModel();
}
이렇게 고치고 돌렸더니 메시지 박스는 뜨는데 아래 같이 뜨네요. 어떻게 해야 하나요? 답변 기다립니다.
이미지 확대
-
답댓글 작성자 김예건 작성시간21.06.30 c00012 동일한 클래스로 2개의 인스턴스가 생긴다는 겁니다. 제가 보기에는 DataContext 가 제대로 설정되지 않아서 경로가 엉뚱하게 되어있어 TwoWay 바인딩이 동작하지 않는 문제이거나, 2개의 인스턴스가 생겨서 하나는 UserControl 에 다른 하나는 MainWindow 에 연결된 문제로 보입니다.
일단 학습이 좀더 필요하실 듯합니다.
추천하는 건 아래 사이트를 먼저 학습하신 뒤,
https://wpf-tutorial.com/
아래 MS 공식 샘플들 중 중요한 기능들을 살펴보시는 겁니다.
https://github.com/microsoft/WPF-Samples
개인적으로 WPF 보다 미래를 위해 MAUI 로 개발하시길 추천드리지만.. 아직 Preview 버전이라 과감하게 추천드리긴 어렵네요. 2021년 11월에 LTS 버전으로 공개되기는 하지만..
차라리 원격으로 점검을 해드릴까요?