Прежде всего, вы не используете MVVM правильно, если вам нужен доступ к элементам пользовательского интерфейса во ViewModel.Вместо этого вам следует рассмотреть возможность использования привязок (независимо от того, что вы делаете: -)
В любом случае, вы можете пройти по визуальному дереву, чтобы найти потомков Window
.Однако FlowDocument
отсутствует в визуальном дереве, так как FrameworkContentElement
, поэтому VisualTreeHelper
не будет работать.
Вам нужно будет объединить VisualTreeHelper
и LogicalTreeHelper
: реализацияэто можно найти здесь: Найти элемент по визуальному дереву
Вот его слегка переписанная версия, используйте его как
if (windows[i].DataContext == this)
{
var flowDocument = windows[i].FindChild<FlowDocument>();
}
DependencyObjectExtensions.CS
public static class DependencyObjectExtensions
{
public static T FindChild<T>(this DependencyObject source) where T : DependencyObject
{
if (source != null)
{
var childs = GetChildObjects(source);
foreach (DependencyObject child in childs)
{
//analyze if children match the requested type
if (child != null && child is T)
{
return (T)child;
}
T descendant = FindChild<T>(child);
if (descendant is T)
{
return descendant;
}
}
}
return null;
}
public static IEnumerable<DependencyObject> GetChildObjects(this DependencyObject parent)
{
if (parent == null) yield break;
if (parent is ContentElement || parent is FrameworkElement)
{
//use the logical tree for content / framework elements
foreach (object obj in LogicalTreeHelper.GetChildren(parent))
{
var depObj = obj as DependencyObject;
if (depObj != null) yield return (DependencyObject)obj;
}
}
else
{
//use the visual tree per default
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
yield return VisualTreeHelper.GetChild(parent, i);
}
}
}
}