MainWindow.xaml, MainwindowViewModel.cs, HaemogramReport.xaml 및 HaemogramReport.xaml.cs가 있습니다. 내 프로젝트에도 다른 파일이 있지만 위의 네 가지 파일에 문제가 있습니다. 다른 사람들이 문제를 파악할 수 있도록 여기에 최소 코드를 게시하고 있습니다. 나는 어떤을 클릭하면WPF에서 바인딩이 예상대로 작동하지 않습니다.
<Page.DataContext>
<vm:MainWindowViewModel />
</Page.DataContext>
<Grid DataContext="{Binding Source={StaticResource Settings}}" PreviewMouseDown="Object_Selection" x:Name="Root">
<Border Style="{StaticResource BorderStyle}" x:Name="HaemogramTestBorder"
Grid.Row="{Binding Default.HaemogramTestGridRow}" Grid.Column="{Binding Default.HaemogramTestGridColumn}"
Grid.RowSpan="{Binding Default.HaemogramTestGridRowSpan}" Grid.ColumnSpan="{Binding Default.HaemogramTestGridColumnSpan}">
<Grid>
<Rectangle Fill="Transparent" x:Name="HaemogramTestRectangle"/>
<TextBlock x:Name="HaemogramTestTextBlock"
Text="{Binding Default.HaemogramTestText}" Visibility="{Binding Default.HaemogramTestVisibility}"
Background="{Binding Default.HaemogramTestBackground, Converter={StaticResource colorToSolidColorBrushConverter}}"
Foreground="{Binding Default.HaemogramTestForeground, Converter={StaticResource colorToSolidColorBrushConverter}}"
FontFamily="{Binding Default.HaemogramTestFontFamily, Converter={StaticResource stringToFontFamilyConverter}}"
FontSize="{Binding Default.HaemogramTestFontSize}"
FontWeight="{Binding Default.HaemogramTestFontWeight}" FontStyle="{Binding Default.HaemogramTestFontStyle}"
HorizontalAlignment="{Binding Default.HaemogramTestHorizontalAlignment}"
VerticalAlignment="{Binding Default.HaemogramTestVerticalAlignment}"
Margin="{Binding Default.HaemogramTestMargin}" />
</Grid>
</Border>
</Grid>
:
지금 HaemogramReport.xaml에서 내가 좋아하는ContentControl
등 예를
HaemogramReport.xaml
를 들어
보인다, Grid
, TextBox
, TextBlock
, Rectangle
, Border
같은 일부 컨트롤을 선언 위의 선언 된 요소의 요소 인 Root
이라는 표의 mousedown 이벤트가 발생합니다.
해당 이벤트 처리기는 HaemogramReport.xmal.cs
입니다. 여기입니다 :
private FrameworkElement selectedObj;
public FrameworkElement SelectedObj
{
get
{
return selectedObj;
}
set
{
selectedObj = value;
OnPropertyChanged("SelectedObj");
}
}
하세요 : 그리드의
private void Object_Selection(object sender, MouseButtonEventArgs e)
{
var mouseWasDownOn = e.Source as FrameworkElement;
if (mouseWasDownOn != null)
{
foreach (Border border in FindVisualChildren<Border>(Root))
{
border.BorderBrush = Brushes.Transparent;
}
if (!(mouseWasDownOn is Border))
{
FindParent<Border>(mouseWasDownOn).BorderBrush = Brushes.Orange;
}
MainWindowViewModel mwvm = new MainWindowViewModel();
mwvm.SelectedObj = mouseWasDownOn;
}
}
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
mouseDown에서 핸들러가 Root
이름, 나는 다음과 같이 mwvm.SelectedObj = mouseWasDownOn;
SelectedObj이 MainwindowViewModel.cs
에 선언 형 FrameworkElement의 속성이라고 내 MainWindow 예를 들어 그 안에 그리드 및 textBox 있습니다. 문제가있는 바인딩은 여기에 선언되어 있습니다. 위의 코드를 사용하여
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Grid DataContext="{Binding SelectedObj, UpdateSourceTrigger=PropertyChanged}">
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged, TargetNullValue='null', FallbackValue='Error'}"/>
</Grid>
, 나는 항상 위의 텍스트 상자에 텍스트 Error
를 얻을 : XAML는 것 같습니다. 다음과 같이 나는이 바인딩 오류가있을 수 있다는 생각 첫 번째 기회에서
MainWindowViewModel.cs
을 변경 :
public class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
SelectedObj = txt;
}
TextBlock txt = new TextBlock()
{
Text = "123"
};
private FrameworkElement selectedObj;
public FrameworkElement SelectedObj
{
get
{
return selectedObj;
}
set
{
selectedObj = value;
OnPropertyChanged("SelectedObj");
}
}
}
을 위와 같이 변경 한 후 나는 텍스트 상자에 123
을 볼 수 있습니다 내 프로젝트를 실행할 때 아무 요소 나 클릭하면 텍스트 상자의 텍스트가 변경되지 않습니다.
이제는 바인딩 오류 인 경우 두 번째 예에서는 텍스트 상자에 123
이 표시되는 반면 첫 번째 예에서는 대체 값인 Error
- 대체 값이 표시됩니다.
그리고 바인딩 오류가 아니라면 위의 코드에서 어떤 문제가 있습니까?
내가 디버깅 업데이트, 나는 SelectedObj
의 get
부분이 호출되지 않습니다 것을 발견했다. 하지만 왜 그런지 몰라?
업데이트 - 리드 Copsey 여기
나의 새로운 클래스입니다 :
public class DesignMethods
{
public static void FindCurrentlyClickedElement(DependencyObject Root, MouseButtonEventArgs e, MainWindowViewModel vm)
{
var mouseWasDownOn = e.OriginalSource as FrameworkElement;
if (mouseWasDownOn != null)
{
foreach (Border border in FindVisualChildren<Border>(Root))
{
border.BorderBrush = Brushes.Transparent;
}
if (!(mouseWasDownOn is Border))
{
FindParent<Border>(mouseWasDownOn).BorderBrush = Brushes.Orange;
}
vm.SelectedObj = mouseWasDownOn;
}
}
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
}
내가 그것을 사용 좋아 :
private void Object_Selection(object sender, MouseButtonEventArgs e)
{
DesignMethods.FindCurrentlyClickedElement(Root, e, this.DataContext as MainWindowViewModel);
}
2 일 전이 질문에 답했습니다. 이제 새로운 클래스에서'Object_Selection'을 옮겨서 여러 곳에서 사용할 수있게되었습니다. 또한 나는이 방법을'정적'으로 표시했다. 그리고 저는'이'를 사용할 수 없습니다. 그래서'MainWindowViewModel'의 Current Instance를 전달해야한다고 생각합니다. 하지만 여전히 출력에 변화가 없습니다. – Khushi
자세한 내용은 업데이트 된 질문을 참조하십시오. 또한 xaml에 내 datacontext를 선언합니다. 언급 한 코드에 영향을 미칩니 까? – Khushi
@Khushi VM의 적절한 인스턴스를 변경 하시겠습니까? setter에 중단 점을 넣으면 변경 내용이 표시됩니까? –